Encapsulating boost::signal and boost::bind

Encapsulating boost::signal and boost::bind

本文关键字:boost bind and signal Encapsulating      更新时间:2023-10-16

我现在有一个问题。我正在尝试将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(&MyClass::MyHandler, &MyClassObject),并将像MyEventObject.Subscribe(&MyClass::MyHandler, &MyClass)一样在外部调用它。有人能帮我填补这两个空白吗?

您可以将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,而在你的包装器中,他必须传递一个指向成员函数的指针和一个指向对象的指针。