是重新解释一件功能,指的'良好的想法?
-
21-09-2019 - |
题
我有一线工作人员,其中有一个列表中的'线行动',并通过它们作为一个时候。
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!”
这可能是真的没有上下文
不隶属于 StackOverflow