2012-08-05 13 views
7

Me preguntaba si hay una manera más agradable de conectar una señal de Boost de una clase directamente a una señal de otra clase.¿Hay alguna manera de conectar una señal de refuerzo directamente a otra señal?

Por ejemplo, imagine un facade class con un grupo de miembros que proporcionan sus propias señales. Ahora suponga que la fachada quiere exponer estas señales. Normalmente termino escribiendo métodos repetitivos que luego conecto como manejadores de señal.

using namespace boost::signal; 

class A 
{ 
public: 
    A(){}; 
    virtual ~A(){}; 

    signal<void()> signalA; 
}; 

class B 
{ 
public: 
    B(){}; 
    virtual ~B(){}; 

    signal<void()> signalB; 
}; 

class Facade 
{ 
private: 
    A& a; 
    B& b; 

public: 
    Facade(A& refA, B& refB) 
    : a(refA), b(refB) 
    { 
    // connect A's signal to facadeSignalA 
    a.signalA.connect(boost::bind(&Facade::forwardedSignalA, this)); 
    // connect B's signal to facadeSignalB 
    b.signalB.connect(boost::bind(&Facade::forwardedSignalB, this)); 
    } 
    virtual ~Facade() {}; 

    // user visible signals 
    signal<void()> facadeSignalA; 
    signal<void()> facadeSignalB; 

private: 
    // ugly boilerplate code used to forward signals 
    void forwardedSignalA() 
    { 
    facadeSignalA(); 
    } 
    void forwardedSignalB() 
    { 
    facadeSignalB(); 
    } 
}; 

Ahora esto no es muy elegante y se vuelve muy tedioso después de un tiempo. ¿Hay alguna forma de hacerlo sin tener que escribir este tipo de métodos de reenvío?

Respuesta

7

Sí, resulta que se pueden "encadenar" señales directamente. Por favor, consulte this thread. No está documentado, pero parece una característica muy útil.

+0

Spot on! Exactamente lo que estaba buscando. – djf

+1

El enlace parece estar muerto. Puede encontrar una discusión relacionada aquí: https://groups.google.com/forum/#!topic/boost-list/So4i8JXneJ0 –

+0

@Kaan C. Fidan actualizado, gracias! –

Cuestiones relacionadas