2014-10-10 3 views
0

나는 부스트 :: signals2을 사용하고 있습니다 : 신호를 GUI가 수준 내에서 다음과 같이 :특정 클래스가 신호 2 콜백 :: 부스트의 유형으로

class GuiElement { 
    //... 
    typedef boost::signals2::signal<void(GuiElement &)> GuiElementSignal; 
    virtual GuiElementSignal &getSignal() { return signal_; }; 
} 

모든 GUI를 - 클래스는이 상속 클래스를 호출하여 콜백을 등록 할 수 있습니다. Toggle 클래스 예 : I는 특정 클래스의 기능에 액세스 할 SpecificClassGuiElement 캐스팅해야하는 콜백 함수마다 내부

toggle.getSignal().connect([](lx::GuiElement &el) { 
    // cast to access toggle specific functions 
    state = static_cast<lx::Toggle &>(el).state(); 
    cout << state << endl; 
}); 

. 나는이 번지는 현상을 방지하고 콜백 서명을 선언하고 싶습니다 : toggle.getSignal().connect([](lx::Toggle &el) {...

T 클래스로 대체 typedef boost::signals2::signal<void(T &)> GuiElementSignal 같은과 템플릿이 실현 할 수있는 방법이 있나요?

+0

더 나은 제목에 대한 제안이있는 분이라면 변경하고 싶습니다. – 0ax1

답변

1

당신은 예를 들어,이 문제를 해결하기 위해 curiously recurring template pattern를 사용할 수 있습니다

template<typename T> 
class GuiElement { 
    //... 
    typedef boost::signals2::signal<void(T&)> GuiElementSignal; 
    virtual GuiElementSignal &getSignal() { return signal_; }; 
}; 

class Button : public GuiElement<Button> {/* ... */}; 
0

당신이 signal_을 노출하지 않으려하고 모든 GUI를 - 클래스는 connect() 기능을 사용한다는 것을 원하지 않는 경우 모든 콜백 함수를 slots으로 등록 할 수 있습니다. 예 : (사용 signals2) :

#include <iostream> 
#include <boost/signals2/signal.hpp> 
#include <boost/bind.hpp> 
#include <boost/optional/optional_io.hpp> 

#define registerEvent_(A) registerEvent(boost::bind(A, this, _1, _2)) 

struct A 
{ 
    typedef boost::signals2::signal<int (int &, int &)> EventSignal; 
    typedef EventSignal::slot_type SlotType; 

    void registerEvent(const SlotType & slot); 
    void triggerAll(int& a1, int& a2); 

    EventSignal signal_; 
}; 

void A::registerEvent(const SlotType & slot) { signal_.connect(slot); } 
void A::triggerAll(int& a1, int& a2) {std::cout << signal_(a1, a2) << "\n";} 

struct B : public A 
{ 
    B(); 
    int myFunc(int& a1, int& a2); 
}; 

B::B() { 
#ifdef WITHMACRO 
    registerEvent_(&B::myFunc); 
#else 
    registerEvent(boost::bind(&B::myFunc, this, _1, _2)); 
#endif 
} 
int B::myFunc(int& a1, int& a2) { return a1 + a2 + 1; } 

int main() 
{ 
    int a1 = 2; 
    int a2 = 3; 
    B b; 
    b.triggerAll(a1, a2); 
} 

참고 : 당신도 bind을 숨기려면 그리고 매크로 (WITHMACRO)를 사용할 수 있습니다.