我想在 C++ 中声明一个成员函数指针,它返回相同的成员函数指针类型
这不起作用:
class MyClass {
public:
typedef FunctionPtr (MyClass::*FunctionPtr)();
}
有人知道解决方案吗?
我想在 C++ 中声明一个成员函数指针,它返回相同的成员函数指针类型
这不起作用:
class MyClass {
public:
typedef FunctionPtr (MyClass::*FunctionPtr)();
}
有人知道解决方案吗?
没有办法做到这一点。事实上,成员函数在这里没有任何区别:没有办法声明一个返回指向它自己函数类型的指针的普通函数。声明将是无限递归的。
对于普通函数,您可以将该void (*)()
类型用作“通用”函数指针类型(就像void *
通常用于数据类型一样)。对于将是void (A::*)()
类型的成员函数指针。不过,您必须reinterpret_cast
为此目的使用。但是,这种用法(往返转换)恰好reinterpret_cast
是定义 的行为时的用法。
当然,您将被迫使用强制类型转换来将指针转换为该类型和从该类型转换。AFAIK,有一个优雅的基于模板的解决方案,其中有一个中间临时模板对象来进行转换。
您可能还想看看这个GotW 条目。
PS注意,void *
语言禁止使用类型作为函数指针的中间类型。虽然这种非法使用可能看起来与普通函数指针一起“工作”,但它绝对没有机会与成员函数指针一起工作。成员函数指针通常是大小大于void *
指针大小的非平凡对象。
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;
}
}
您尝试做的事情是不可能的 - 函数的返回类型是函数本身的类型,目前尚不清楚,因此会导致无限循环。