7

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

这不起作用:

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

有人知道解决方案吗?

4

3 回答 3

5

没有办法做到这一点。事实上,成员函数在这里没有任何区别:没有办法声明一个返回指向它自己函数类型的指针的普通函数。声明将是无限递归的。

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

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

您可能还想看看这个GotW 条目

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

于 2010-07-02T20:28:08.283 回答
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;
        }

} 
于 2010-07-02T21:26:46.293 回答
0

您尝试做的事情是不可能的 - 函数的返回类型是函数本身的类型,目前尚不清楚,因此会导致无限循环。

于 2010-07-02T20:28:46.210 回答