c++ - 重新解释成员函数指针 a 'good idea' 吗?

标签 c++ pointer-to-member reinterpret-cast

我有一个工作线程,它包含一个“线程操作”列表,并按时间处理它们。

template <class T> class ThreadAction
{
public:

  typedef void (T::*action)();

  ThreadAction(T* t, action f) :
    func(f),obj(t) {}
  void operator()() { (obj->*func)(); }

  void (T::*func)();
  T* obj;

};

通常这样称呼

myActionThread->addAction(
    new ThreadAction<TheirClass>(this, &TheirClass::enable)
);

之前一切正常
 void TheirClass::enable()

改为

 bool TheirClass::enable()

遗憾的是,我们不能再将其改回原样,因为其他内容需要新格式(并且重载不能仅因返回类型而不同)。

我试过了

myActionThread->addAction( 
    new ThreadAction<TheirClass>(this, 
        reinterpret_cast<void(TheirClass::*)>(&TheirClass::enable)
    )
);

这似乎工作得很好,但我不确定像这样重新解释函数指针是否是“已定义”行为,有人可以建议一下吗?

最佳答案

这绝对是支持的行为,并且可能导致您的程序崩溃。

基本上,您需要为 TheirClass::enable() 制作一个具有正确返回类型的包装器。一个简单的一行就足够了:

public:
    void enableWrapper() { enable(); };

然后调用:

myActionThread->addAction(
    new ThreadAction<TheirClass>(this, &TheirClass::enableWrapper)
);

如果您不能直接修改TheirClass,那么创建一个实现包装器的简单子(monad)类或辅助类。

关于c++ - 重新解释成员函数指针 a 'good idea' 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1572909/

相关文章:

c++ - 如何在 C++ 中使函数内联

c++ - 使用纯虚方法克隆 C++ 类

c++ - 获取指向 lambda 的函数指针?

c++ - 在不知道是哪个类的情况下调用C++成员函数指针

c++ - 指向类方法错误的指针数组 C++11

c++ - 将_cast 重新解释为 void 是否合法*

c++ - 解析类似于 C++ 的东西

c++ - 为什么在C++中多了一个&来传递非静态成员函数的地址给线程?

c++ - 什么时候使用 reinterpret_cast 而不违反严格的别名规则?

c++ - C++::安全地使用reinterpret_cast生成 “wrapper”迭代器