2013-05-01 76 views
0

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

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

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

我已经尝试在订阅功能的签名和视觉工作室传递函数指针只是给了我错误的语气。 我不知道如何写订阅的签名和什么进入boost :: bind,理想情况下,我将在订阅功能中有boost::bind(&MyClass::MyHandler, &MyClassObject),并将其称为外部,如MyEventObject.Subscribe(&MyClass::MyHandler, &MyClass)。 任何人都可以帮我填补那两个空白吗?

回答

0

你可以只让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,同时用包装器,他必须传递一个指向成员函数的指针和一个指向对象的指针。

+0

谢谢伊戈尔。我的老板要求我封装它,以避免在任何地方升级lib。我真的想要公开它,因为它更灵活使用boost :: signal – cynric4sure 2013-05-06 13:43:11

+0

@ cynric4sure你的意思是你需要消除接口的提升?然后,请注意以下几点:1)您的类仍然在其定义中公开'boost :: signals'(尽管它是'private'),因此用户的代码将依赖于boost头文件。你可能想通过pImpl来隐藏它; 2)你不必限制用户指向成员函数的指针!相反,接受任何可调用,并让用户使用'std :: bind'或任何他想要的来创建它。 – 2013-05-06 14:22:01