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

时间:2010-07-02 20:22:21

标签: c++ declaration return-type member-pointers

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

这不起作用:

class MyClass { 
public: 
        typedef FunctionPtr (MyClass::*FunctionPtr)(); 
}

有人知道解决方案吗?

3 个答案:

答案 0 :(得分:5)

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

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

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

您可能还想查看此GotW entry

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

答案 1 :(得分: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;
        }

} 

答案 2 :(得分:0)

你要做的事情是不可能的 - 函数的返回类型是函数本身的类型,这是尚未知的,因此它会导致无限循环。