【问题标题】:Creating multicast events with std::tr1::function (or boost::function)使用 std::tr1::function(或 boost::function)创建多播事件
【发布时间】:2010-02-09 04:12:11
【问题描述】:

我正在尝试使用 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

这是由 list 标头的第 1194 行引起的,该标头位于 remove 函数中。这是什么原因造成的?

【问题讨论】:

    标签: c++ stl boost delegates tr1


    【解决方案1】:

    如果您正在寻找 C++ 中的多播委托,最好的选择是Boost.Signals2。您还可以使用Boost.Bind 使成员函数可以用于回调。

    您可以查看我的示例 here,了解 Boost.Signals 和 Boost.Bind 的简单用法。

    Boost.Signal 提供生命周期管理工具,以确保事件不会发布给不再存在的订阅者。

    【讨论】:

      【解决方案2】:

      我认为这是完全相同的问题:comparing-stdtr1function-objects

      (基本上你不能比较函子,这就是为什么擦除或任何使用 operator== 的东西都行不通的原因)

      【讨论】:

        【解决方案3】:

        你应该看看萨特的Generalizing Observer

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-12-06
          • 1970-01-01
          • 2012-06-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多