我有一个工作线程,它包含一个“线程操作”列表,并按时间处理它们。
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/