2010-07-21 5 views
3

J'ai une classe avec un membre de signal encapsulé avec boost :: function.Passe boost :: signal comme boost :: function

Est-il possible d'ajouter un autre signal en tant que gestionnaire avec cette API?

class Foo 
{ 
public: 
    VOID AddHandler(boost::function<VOID()> handler) 
    { 
    m_signal.connect(handler); 
    } 

private: 
    boost::signal<VOID()> m_signal; 
}; 

boost::signal<VOID()> signal; 

VOID SignalCaller() 
{ 
    signal(); 
} 

int main() 
{ 
    Foo foo; 
    //foo.AddHandler(signal); // I want to 
    foo.AddHandler(&SignalCaller); // I have to 
} 

Répondre

7

utiliser le type "slot_type" qui est déclaré dans votre type de signal

class Foo 
{ 
public: 
    typedef boost::signal0<void> Signal; 
    typedef Signal::slot_type Slot; 

    //allowed any handler type which is convertible to Slot 
    void AddHandler(Slot handler) 
    { 
     m_signal.connect(handler); 
    } 
private: 
    Signal m_signal; 
}; 

void f() 
{ 
    std::cout << "f() called"; 
} 

//usage 
    Foo foo; 
    foo.AddHandler(signal); 
    foo.AddHandler(&f); 
+0

thx pour l'intérêt, mais cela ne fonctionne pas pour moi. – Eugene

+0

ah, il a le type de retour difficile – Alsk

+0

la réponse est corrigée – Alsk

Questions connexes