我有一线工作人员,其中有一个列表中的'线行动',并通过它们作为一个时候。

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,然后创建一个简单的子类或辅助类实现该包装。

其他提示

犯错,从我理解,你在铸造一个方法,该方法返回 bool 一个方法,该方法返回 void ?

这可能是危险的,根据的呼吁/退《公约》在使用。你的 可能会 忘了流行的返回值的或替代的价值登记,返回的价值。

不是一个好主意。考虑增加一个额外的模板参数返回类型:

template <class T, typename RetType> class ThreadAction
{
public:
 typedef RetType (T::*action)();
 ThreadAction(T* t, action f) :
   func(f),obj(t) {}

 RetType operator()() { return (obj->*func)(); }
 RetType (T::*func)();
 T* obj;
};

这是返回空隙的

我通常发现,当问题的形式为“_______是一个好主意吗?”答案几乎都是 “NO!”

这可能是真的没有上下文

scroll top