Fra*_*k28 7 c++ declaration return-type member-pointers
我想在C++中声明一个成员函数指针,它返回相同的成员函数指针类型
这不起作用:
class MyClass {
public:
typedef FunctionPtr (MyClass::*FunctionPtr)();
}
Run Code Online (Sandbox Code Playgroud)
有人知道解决方案吗?
没有办法实现这一目标.实际上,成员函数在这里没有区别:没有办法声明一个返回指向其自己的函数类型的指针的普通函数.声明将是无限递归的.
在普通函数的情况下,您可以将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;
}
}
Run Code Online (Sandbox Code Playgroud)