我正在尝试使用 TR1 的功能创建类似 C# 的多播委托和事件。或者 Boost,因为 boost::function (大部分)与 std::tr1::function 相同。作为概念证明,我尝试了以下方法:
template<typename T1>
class Event
{
private:
typedef std::tr1::function<void (T1)> action;
std::list<action> callbacks;
public:
inline void operator += (action func)
{
callbacks.push_back(func);
}
inline void operator -= (action func)
{
callbacks.remove(func);
}
void operator ()(T1 arg1)
{
for(std::list<action>::iterator iter = callbacks.begin();
iter != callbacks.end(); iter++)
{
(*iter)(arg1);
}
}
};
有点有效。线路callbacks.remove(func)
才不是。当我编译它时,我收到以下错误:
error C2451: conditional expression of type 'void' is illegal
这是由第 1194 行引起的list
标头,位于remove
功能。是什么原因造成的?
如果您正在寻找 C++ 中的多播委托,那么您最好的选择是升压信号2。您还可以使用升压绑定使得可以使用成员函数进行回调。
你可以看看我的例子hereBoost.Signals 和 Boost.Bind 的简单使用。
Boost.Signal 提供生命周期管理工具,以确保事件不会发布到不再存在的订阅者。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)