2013-05-01 4 views
0

J'ai un problème maintenant. J'essaie d'encapsuler boost :: signal et boost :: bind dans ma propre classe Event.Encapsulation boost :: signal et boost :: bind

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

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

j'essayer de passer le pointeur de fonction dans la signature de la fonction Inscrivez-vous et visual studio me donne juste des tons d'erreurs. Je ne sais pas comment écrire la signature de Subscribe et What pour passer dans boost :: bind, idéalement, je vais avoir boost::bind(&MyClass::MyHandler, &MyClassObject) dans la fonction Subscribe et l'appeler à l'extérieur comme MyEventObject.Subscribe(&MyClass::MyHandler, &MyClass). Est-ce que des personnes peuvent m'aider à remplir ces deux espaces?

Répondre

0

Vous pouvez juste faire Subscribe un modèle:

#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! 
} 

Notez cependant qu'une telle enveloppe limite son utilisateur très bien: avec signal d'origine, il pourrait se connecter une callable de quelque nature que créé de diverses manières, alors que votre wrapper il doit passer un pointeur sur la fonction membre et un pointeur vers l'objet.

+0

Merci Igor. Mon patron me demande de l'encapsuler afin d'éviter de booster partout. Je veux vraiment l'exposer car il est plus flexible d'utiliser boost :: signal – cynric4sure

+0

@ cynric4sure Vous voulez dire que vous devez éliminer le boost des interfaces? Ensuite, faites attention aux points suivants: 1) votre classe expose toujours 'boost :: signals' dans sa définition (bien que ce soit' private') et donc le code de l'utilisateur dépendra des en-têtes boost. Vous pourriez vouloir le cacher au moyen de pImpl; 2) Vous n'avez pas à limiter l'utilisateur avec un pointeur vers la fonction membre! Au lieu de cela, acceptez tout appelable et laissez l'utilisateur le créer avec 'std :: bind' ou ce qu'il veut. –

Questions connexes