2010-02-09 184 views
3

我试图使用TR1的功能创建类似C#的多播委托和事件。或Boost,因为boost :: function(大部分)与std :: tr1 :: function相同。作为一个概念证明,我尝试了这个:使用std :: tr1 :: function(或boost :: 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 

这是由list头,这是在remove功能的1194线引起的。这是什么造成的?

回答

5

如果你正在寻找C++中的组播代表,你最好的选择是Boost.Signals2。您还可以使用Boost.Bind来使用成员函数进行回调。

你可以看看我的例子here简单使用Boost.Signals和Boost.Bind。

Boost.Signal提供终身管理功能以确保事件不会发布给不再存在的订户。

+0

啊,谢谢。应该知道Boost已经提供了这个。 – 2010-02-09 06:07:11

相关问题