【问题标题】:Encapsulating boost::signal and boost::bind封装 boost::signal 和 boost::bind
【发布时间】:2013-05-01 21:06:29
【问题描述】:

我现在有问题。我正在尝试将 boost::signal 和 boost::bind 封装到我自己的 Event 类中。

class MyEvent
{
private:
  boost::signal<void ()> Sig;
public:
  void Subscribe(.........)
  {
    Sig.connect(boost:bind(.........);
  }

  void Raise()
  {
    Sig();
  }
};

我尝试在订阅函数的签名中传递函数指针,而 Visual Studio 只会给我一些错误提示。 我不知道如何编写订阅的签名以及传递给 boost::bind 的内容,理想情况下,我将在订阅函数中有boost::bind(&amp;MyClass::MyHandler, &amp;MyClassObject),并像MyEventObject.Subscribe(&amp;MyClass::MyHandler, &amp;MyClass) 一样在外部调用它。 谁能帮我填补这两个空白?

【问题讨论】:

    标签: c++ boost boost-bind boost-signals


    【解决方案1】:

    您可以将Subscribe 设为模板:

    #include <boost/signals2.hpp>
    #include <boost/bind.hpp>
    class MyEvent
    {
    private:
      boost::signals2::signal<void ()> Sig;
    public:
      template<class SlotClass> 
      void Subscribe(void (SlotClass::*func)(), SlotClass *obj)
      {
        Sig.connect(boost::bind(func, obj));
      }
      void Raise()
      {
        Sig();
      }
    };
    
    struct Test
    {
      void f()
      {}
    };
    
    int main()
    {
      MyEvent myEvent;
      Test test;
      myEvent.Subscribe(&Test::f, &test); // test must outlive myEvent!
    }
    

    但是请注意,这样的包装器极大地限制了它的用户:使用原始signal,他可以连接以各种方式创建的任何类型的任何callable,而使用你的包装器,他必须传递一个指向成员函数的指针和一个指针反对。

    【讨论】:

    • 谢谢伊戈尔。我的老板让我把它封装起来,以免到处都是 boost lib。我真的很想公开它,因为使用 boost::signal 更灵活
    • @cynric4sure 你的意思是你需要消除接口的提升?然后,请注意以下几点:1)您的类仍然在其定义中公开boost::signals(尽管它是private),因此用户的代码将依赖于boost headers。您可能想通过 pImpl 隐藏它; 2)您不必使用指向成员函数的指针来限制用户!相反,接受任何可调用并让用户使用std::bind 或他想要的任何内容创建它。
    猜你喜欢
    • 2011-12-07
    • 2011-07-11
    • 1970-01-01
    • 1970-01-01
    • 2016-03-16
    • 2023-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多