当想要存储指向具有不同签名的函数的指针时,可以将它们转换为void(*)()
(或任何其他函数指针类型),然后在调用之前将它们转换回原始类型,并且afaik C ++保证此往返上班。但是成员函数指针呢?是否有任何保证通过另一个不同类型的成员函数指针(可能是不同类的成员函数)往返成员函数指针不会破坏某些东西?
答案 0 :(得分:1)
是的,指针到成员类型之间的reinterpret_cast
往返保证是有效的,只要你保持指针到数据成员或指向成员函数的指针都是有效的。例。
引用C ++ 11:
[expr.reinterpret.cast]
10类型“指向类型为
X
T1
成员的指针”的prvalue可以显式转换为不同类型的prvalue“指向Y
类型T2
成员的指针{1}}“如果T1
和T2
都是函数类型或两种对象类型。空成员指针值(4.11)将转换为目标类型的空成员指针值。除以下情况外,此转换的结果未指定:
- 将“指向成员函数的指针”类型的prvalue转换为指向成员函数类型的不同指针,并返回其原始类型,从而生成指向成员值的原始指针。
答案 1 :(得分:0)
我认为reinterptret_cast
是这样的。这就是标准所说的(5.2.11 / 10)
如果T1和T2都是函数类型或两种对象类型,则可以将类型“指向类型T1的X成员的指针”类型的prvalue显式转换为不同类型的prvalue“指向类型为T2的Y的成员的指针” .71将空成员指针值(4.11)转换为目标类型的空成员指针值。除以下情况外,此转换的结果未指定:
- 将“指向成员函数的指针”类型的prvalue转换为指向成员函数类型的不同指针,并返回其原始类型,从而生成指向成员值的原始指针。
- 将“指向类型T1的X的数据成员的指针”类型的prvalue转换为类型“指向T2类型的Y的数据成员的指针”(其中T2的对齐要求不比T1的更严格)和返回其原始类型会产生指向成员值的原始指针。