void(*)()模拟成员函数指针往返转换

时间:2013-09-13 16:59:03

标签: c++ casting standards-compliance type-safety member-function-pointers

当想要存储指向具有不同签名的函数的指针时,可以将它们转换为void(*)()(或任何其他函数指针类型),然后在调用之前将它们转换回原始类型,并且afaik C ++保证此往返上班。但是成员函数指针呢?是否有任何保证通过另一个不同类型的成员函数指针(可能是不同类的成员函数)往返成员函数指针不会破坏某些东西?

2 个答案:

答案 0 :(得分:1)

是的,指针到成员类型之间的reinterpret_cast往返保证是有效的,只要你保持指针到数据成员或指向成员函数的指针都是有效的。例。

引用C ++ 11:

[expr.reinterpret.cast]

  

10类型“指向类型为X T1成员的指针”的prvalue可以显式转换为不同类型的prvalue“指向Y类型T2成员的指针{1}}“如果T1T2都是函数类型或两种对象类型。空成员指针值(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的更严格)和返回其原始类型会产生指向成员值的原始指针。