void (*) () аналог для указателя на функцию-член.

Когда кто-то хочет хранить указатели на функции с разными сигнатурами, он может привести их к void(*)() (или любой другой тип указателя на функцию) затем приведите их обратно к исходному типу перед вызовом, и afaik C ++ гарантирует, что это двустороннее выполнение. Но как насчет указателей на функции-члены? Существуют ли какие-либо гарантии, что обратное переключение указателя на функцию-член через другой указатель на функцию-член другого типа (возможно, на функцию-член другого класса) не приведет к поломке?

2

Решение

Да reinterpret_cast Обход между типами указатель на элемент гарантированно будет действительным, если вы сохраняете его указатель на элемент-член или указатель на элемент-функцию в обоих случаях.

Цитирую C ++ 11:

[expr.reinterpret.cast]

10 Значение типа «указатель на член X типа T1«может быть явно преобразовано в значение другого типа» указатель на член Y типа T2» если T1 а также T2 оба типа функций или оба типа объектов. Значение указателя нулевого элемента (4.11) преобразуется в значение указателя нулевого элемента целевого типа. Результат этого преобразования не указан, за исключением следующих случаев:

  • Преобразование значения типа «указатель на функцию-член» в другой указатель на тип функции-члена и обратно в его исходный тип дает исходный указатель на значение члена.
1

Другие решения

Я так думаю с reinterptret_cast, Вот что говорится в стандарте (5.2.11 / 10)

Значение типа «указатель на член X типа T1» может быть явно преобразовано в значение типа «указатель на член Y типа T2», если T1 и T2 оба являются функциональными типами или обоими типами объектов.71 значение указателя нулевого элемента (4.11) преобразуется в значение указателя нулевого элемента целевого типа. Результат этого преобразования не указан, за исключением следующих случаев:

— преобразование значения типа «указатель на функцию-член» в другой указатель на тип функции-члена и обратно в исходный тип дает исходный указатель на значение члена.

— преобразование значения типа «указатель на элемент данных X типа T1» в тип «указатель на элемент данных Y типа T2» (где требования к выравниванию для T2 не более строгие, чем требования для T1) и обратно к его оригинальный тип возвращает исходный указатель на значение элемента.

0

По вопросам рекламы [email protected]