c++ - 从 const 成员函数调用非常量成员函数指针

标签 c++ c++11

我有以下代码:

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实例已创建为非常量。 否则,这将调用未定义的行为。

关于c++ - 从 const 成员函数调用非常量成员函数指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36823606/

相关文章:

c++ - TinyXML2 似乎没有正确加载我的文件?

c++ - 如何使此模板 typedef 在 C++11 中有效?

c++ - 如何使用c++11函数回调声明多个模板参数

c++ - 在 Windows XP 中是否有 inet_ntop/InetNtop 的替代品?

c++ - 如何在继承的类/结构中添加 union 成员

c++ - 使用 sqlite 和 c++ 对数据库表进行实际排序的最佳方法?

c++ - boost 或 STL 是否有用于比较两个 char 值的谓词?

c++ - avr-g++ undefined reference

C++:std::unordered_map 保证是基于节点的吗?

c++ - 使用 long double 但不使用 double 的未定义行为