2013-05-01 101 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