代码之家  ›  专栏  ›  技术社区  ›  Matthew Olenik

使用std::tr1::function(或boost::function)创建多播事件

  •  3
  • Matthew Olenik  · 技术社区  · 16 年前

    我正在尝试使用TR1的功能创建类似C的多播委托和事件。或boost,因为boost::函数(大部分)与std::tr1::函数相同。作为概念的证明,我尝试过:

    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 功能。这是什么原因造成的?

    3 回复  |  直到 16 年前
        1
  •  4
  •   Community Mohan Dere    9 年前

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

    (基本上你不能比较函数,这就是为什么用操作符==擦除或任何东西都不能工作的原因)

        2
  •  5
  •   Community Mohan Dere    9 年前

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

    你可以看看我的例子 here 简单使用boost.signals和boost.bind。

    信号提供了终身管理工具,以确保事件不会发布到不再存在的订户。

        3
  •  0
  •   Gabriel    16 年前

    你应该看看萨特的 Generalizing Observer

    推荐文章