成员函数指针返回相同类型的成员函数指针

Fra*_*k28 7 c++ declaration return-type member-pointers

我想在C++中声明一个成员函数指针,它返回相同的成员函数指针类型

这不起作用:

class MyClass { 
public: 
        typedef FunctionPtr (MyClass::*FunctionPtr)(); 
}
Run Code Online (Sandbox Code Playgroud)

有人知道解决方案吗?

AnT*_*AnT 5

没有办法实现这一目标.实际上,成员函数在这里没有区别:没有办法声明一个返回指向其自己的函数类型的指针的普通函数.声明将是无限递归的.

在普通函数的情况下,您可以将void (*)()类型用作"通用"函数指针类型(就像void *通常用于数据类型一样).对于将是void (A::*)()类型的成员函数指针.你必须reinterpret_cast为此目的使用.但是,这种用法(往返转换)恰好reinterpret_cast是定义行为时的用法.

当然,您将被迫使用强制转换将指针转换为该类型的指针.AFAIK,有优雅的基于模板的解决方案,其中包含一个用于执行转换的中间临时模板对象.

您可能还想看一下这个GotW条目.

PS注意,void *语言禁止使用类型作为函数指针的中间类型.虽然这种非法使用似乎与普通函数指针"一起工作",但它绝对没有机会使用成员函数指针.成员函数指针通常是非平凡对象,其大小大于void *指针的大小.


MSN*_*MSN 5

AndreyT在GotW#57上引用了最佳答案,所以我不妨在这里复制它:

class MyClass {  
public: 
        struct FunctionPtrProxy;
        typedef FunctionPtrProxy (MyClass::*FunctionPtr)();  

        struct FunctionPtrProxy
        {
               FunctionPtrProxy(FunctionPtr pp ) : p( pp ) { }
               operator FunctionPtr() { return p; }
               FunctionPtr p;
        }

} 
Run Code Online (Sandbox Code Playgroud)