2011-09-19 5 views
2

우리는 event 클래스를 선언 한 클래스에서만 호출 할 수있는 특별한 종류의 델리게이트 인 event 키워드를 사용합니다. 그래서 boost :: signals2를 사용하여 네이티브 C++에서이 작업을 수행하는 방법이 있습니까? 그렇다면 성능면에서 비싸지 않습니까?C++ boost signals 2

답변

3

일반적으로 C++ 함수의 호출 기능을 제한하는 접근법은 해당 클래스 외부에서 인스턴스화 할 수없는 유형의 더미 매개 변수 (의도 한 클래스에 대해 'friend'선언이있는 개인 팩토리 또는 생성자)를 전달하는 데 의존합니다.

boost :: signals2 :: 신호에 적용하면 관계없는 매개 변수가있는 신호 정의가됩니다.

정말로 호출 할 수 없도록 설정해야하는 경우 개체 구성원 일뿐입니다 (적어도 내가 사용하는 것처럼 ...).이 멤버를 개인 또는 보호 된 멤버로 선언하고 공용으로 제공 할 수 있습니다 함수를 사용하여 연결합니다.

class FooEmitter 
{ 
public: 
    boost::signals2::scoped_connection ConnectToFoo(boost::function<void (Emitter&)>& handler) 
    { 
     return fooSignal.connect(handler); 
    } 

    void triggerFoo() { 
     fooSignal(*this); 
    } 
private: 
    boost::signals2::signal<void (Emitter&)> fooSignal; 
}; 

class FooHandler 
{ 
public: 
    FooHandler() 
    { 
     fooConnection = getAnEmitter().ConnectToFoo(boost::bind(&FooHandler::HandleFoo, this, _1); 
    } 

    void HandleFoo(Emitter&) 
    { 
     // handler body 
    } 

private: 
    boost::signals2::scoped_connection fooConnection; 
} 

당신은 물론 당신의 모델이 충분히 견고 경우 FooHandler &을하고 거기에 바인딩을 수행 할 ConnectToFoo 방법을 재 배열 할 수있다.

더미면은 좋은 컴파일러를 사용하는 것이 효과적이며이 메커니즘은 추가적인 함수 호출이거나 핸들러 당 두 번 (신호 당)이 아닙니다.

관련 문제