我有以下代码:
class MyClass;
typedef void(MyClass::*func_ptr)();
class MyClass
{
public:
MyClass()
{
f = &MyFunc1;
}
void MyFunc1()
{
// ...
}
void MyFunc2() const
{
(this->*f)();
}
func_ptr f;
};
如果我尝试编译,它会失败,因为MyFunc2()是一个const方法,试图调用类型为func_ptr的非const的函数指针 .
我正在试图找出最好的方法 . 我可以使用标准的C样式演员:
typedef void(MyClass::*func_ptr2)() const;
func_ptr2 f2 = (func_ptr2)f;
(this->*f2)();
但我更喜欢使用C cast(即static_cast,reinterpret_cast或const_cast) . 我用reinterpret_cast进行编译但是我无法使用const_cast . 我认为const_cast不适用于这种情况?另外,有没有更简洁的方法来创建另一个typedef吗?
3 回答
这段代码中有几个问题 .
不是格式正确的C,因为获取非静态成员函数的地址需要完全限定的名称:
this
是const成员函数中的MyClass const*
. 您可能需要抛弃const
:一个更好的解决方案可能是重新考虑设计,以避免与
const_cast
打击类型系统 .典型的解决方案是
(const_cast<MyClass*>(this)->*f)();
.只要
MyClass
实例已创建为非const,这是合法的 . 否则,这将调用未定义的行为 .以下似乎编译: