2013-05-01 3 views
0

У меня проблема. Я пытаюсь encapsulatie boost :: signal и boost :: bind в свой собственный класс Event.Encapsulating boost :: signal and boost :: bind

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

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

меня пытаюсь передать указатель на функцию в подписи функции ПОДПИСАТЬСЯ и визуальную студию просто дает мне тона ошибок. Я не знаю, как написать подпись Subscribe и Что передать в 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

+0

@ cynric4sure. Вы имеете в виду, что вам необходимо устранить усиление от интерфейсов? Затем обратите внимание на следующие моменты: 1) ваш класс по-прежнему предоставляет «boost :: сигналы» в своем определении (хотя это «частный»), и, следовательно, код пользователя будет зависеть от заголовков форвардов. Вы можете скрыть его с помощью pImpl; 2) Вам не нужно ограничивать пользователя указателем на функцию-член! Вместо этого принимайте любые вызываемые и позволяйте пользователю создавать его с помощью 'std :: bind' или того, что он хочет. –

Смежные вопросы