우리는 event 클래스를 선언 한 클래스에서만 호출 할 수있는 특별한 종류의 델리게이트 인 event 키워드를 사용합니다. 그래서 boost :: signals2를 사용하여 네이티브 C++에서이 작업을 수행하는 방법이 있습니까? 그렇다면 성능면에서 비싸지 않습니까?C++ boost signals 2
2
A
답변
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 방법을 재 배열 할 수있다.
더미면은 좋은 컴파일러를 사용하는 것이 효과적이며이 메커니즘은 추가적인 함수 호출이거나 핸들러 당 두 번 (신호 당)이 아닙니다.