[英]Calling non-const member function pointer from const member function
我有以下代码:
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方法,试图调用非const的func_ptr类型的函数指针,它会失败。
我正在尝试找出最好的方式来投射它。 我可以使用标准的C样式转换:
typedef void(MyClass::*func_ptr2)() const;
func_ptr2 f2 = (func_ptr2)f;
(this->*f2)();
但是我更喜欢使用C ++强制转换(即static_cast,reinterpret_cast或const_cast)。 我可以使用reinterpret_cast进行编译,但是不能与const_cast一起使用。 我以为const_cast不是要用于这种情况? 另外,是否有一种更清洁的方式来执行此操作而不必创建另一个typedef?
典型的解决方案是(const_cast<MyClass*>(this)->*f)();
。
只要MyClass
实例是非常量创建的,这是合法的。 否则,这将引发未定义的行为。
此代码中有两个问题。
f = &MyFunc1;
格式不正确的C ++,因为采用非静态成员函数的地址需要完全限定的名称:
f = &MyClass::MyFunc1;
this
是const成员函数中的MyClass const*
。 您可能需要丢弃该const
:
(const_cast<MyClass*>(this)->*f)();
更好的解决方案可能是重新考虑设计,以避免与const_cast
对抗类型系统。
以下内容似乎可以编译:
MyClass()
{
f = &MyClass::MyFunc1;
}
void MyFunc1()
{
// ...
}
void MyFunc2() const
{
MyClass* mc = const_cast<MyClass*>(this);
(mc->*f)();
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.