我想在C ++中声明一个成员函数指针,它返回相同的成员函数指针类型
这不起作用:
class MyClass {
public:
typedef FunctionPtr (MyClass::*FunctionPtr)();
}
有人知道解决方案吗?
答案 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)
你要做的事情是不可能的 - 函数的返回类型是函数本身的类型,这是尚未知的,因此它会导致无限循环。