Когда кто-то хочет хранить указатели на функции с разными сигнатурами, он может привести их к void(*)()
(или любой другой тип указателя на функцию) затем приведите их обратно к исходному типу перед вызовом, и afaik C ++ гарантирует, что это двустороннее выполнение. Но как насчет указателей на функции-члены? Существуют ли какие-либо гарантии, что обратное переключение указателя на функцию-член через другой указатель на функцию-член другого типа (возможно, на функцию-член другого класса) не приведет к поломке?
Да reinterpret_cast
Обход между типами указатель на элемент гарантированно будет действительным, если вы сохраняете его указатель на элемент-член или указатель на элемент-функцию в обоих случаях.
Цитирую C ++ 11:
[expr.reinterpret.cast]
10 Значение типа «указатель на член
X
типаT1
«может быть явно преобразовано в значение другого типа» указатель на членY
типаT2
» еслиT1
а такжеT2
оба типа функций или оба типа объектов. Значение указателя нулевого элемента (4.11) преобразуется в значение указателя нулевого элемента целевого типа. Результат этого преобразования не указан, за исключением следующих случаев:
- Преобразование значения типа «указатель на функцию-член» в другой указатель на тип функции-члена и обратно в его исходный тип дает исходный указатель на значение члена.
Я так думаю с reinterptret_cast
, Вот что говорится в стандарте (5.2.11 / 10)
Значение типа «указатель на член X типа T1» может быть явно преобразовано в значение типа «указатель на член Y типа T2», если T1 и T2 оба являются функциональными типами или обоими типами объектов.71 значение указателя нулевого элемента (4.11) преобразуется в значение указателя нулевого элемента целевого типа. Результат этого преобразования не указан, за исключением следующих случаев:
— преобразование значения типа «указатель на функцию-член» в другой указатель на тип функции-члена и обратно в исходный тип дает исходный указатель на значение члена.
— преобразование значения типа «указатель на элемент данных X типа T1» в тип «указатель на элемент данных Y типа T2» (где требования к выравниванию для T2 не более строгие, чем требования для T1) и обратно к его оригинальный тип возвращает исходный указатель на значение элемента.