C++ 封装boost::signal和boost::bind

C++ 封装boost::signal和boost::bind,c++,boost,boost-bind,boost-signals,C++,Boost,Boost Bind,Boost Signals,我现在有个问题。我试图将boost::signal和boost::bind封装到我自己的事件类中 class MyEvent { private: boost::signal<void ()> Sig; public: void Subscribe(.........) { Sig.connect(boost:bind(.........); } void Raise() { Sig(); } }; classmyevent { 私人:

我现在有个问题。我试图将boost::signal和boost::bind封装到我自己的事件类中

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

  void Raise()
  {
    Sig();
  }
};
classmyevent
{
私人:
boost::信号Sig;
公众:
无效认购(……)
{
信号连接(升压:绑定);
}
作废
{
Sig();
}
};
我试图在Subscribe函数的签名中传递函数指针,而visualstudio只是给出了一些错误提示。 我不知道如何编写Subscribe的签名以及将什么传递到boost::bind中,理想情况下,我将在Subscribe函数中使用
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!
}
#包括
#包括
MyEvent类
{
私人:
boost::signals2::Sig信号;
公众:
模板
void订阅(void(SlotClass::*func)(),SlotClass*obj)
{
Sig.connect(boost::bind(func,obj));
}
作废
{
Sig();
}
};
结构测试
{
void f()
{}
};
int main()
{
MyEvent-MyEvent;
试验;
订阅(&Test::f,&Test);//测试必须比myEvent更有效!
}

但是请注意,这样的包装器对用户的限制非常大:使用原始的
信号
,他可以连接以各种方式创建的任何类型的
可调用
,而使用您的包装器,他必须传递一个指向成员函数的指针和一个指向对象的指针。

谢谢Igor。我的老板让我对其进行封装,以避免每次使用boost lib其中。我真的想公开它,因为使用boost更灵活:signal@cynric4sure你的意思是你需要从接口中消除boost?那么,请注意以下几点:1)你的类仍然在其定义中公开了
boost::signals
(尽管它是
私有的
)因此,用户的代码将取决于boost头文件。你可能想通过pImpl来隐藏它;2) 您不必使用指向成员函数的指针来限制用户!相反,接受任何可调用项,让用户使用
std::bind
或任何他想要的东西来创建它。