문제

콜백 메커니즘이 있습니다. 관련된 클래스는 다음과 같습니다.

class App
{
    void onEvent(const MyEvent& event);
    void onEvent(const MyOtherEvent& event);

    Connector connect;
}

class Connector
{  
   template <class T> void Subscribe(boost::function <void (const T&)> callback);
}

App::App()
{
    connect.Subscribe<MyEvent>(&App::OnEvent<MyEvent>);
}

먼저이 코드는 컴파일하지 않으며 그림입니다.

템플릿을 사용하면 내 예제가 복잡해 지지만 내 문제에 영향을 미치기 때문에 남겨 두었습니다. 커넥터 클래스가 얼마나 많은 이벤트 유형을 처리하는지 알지 못하기 때문에 내 구독이 템플릿을 찍어야하는 것 같습니다. 내가 만들려고 할 때 :

boost::function f = &App::OnEvent, 

전문화와 함께 템플릿 함수로 Onevent를 만들려고 시도했지만 컴파일러는 템플릿 전문화 대신 Onevent 함수를 과부하로 처리하는 것 같습니다.

template <> OnEvent(const MyEvent& e) ...

다음을 컴파일 할 수 있습니다.

boost::function <void (App*, const MyEvent&)> f = &App::OnEvent;
f(this, e); 

그것은 컴파일, 실행 및 작동합니다.

boost::function<void (const MyEvent&)> g = boost::bind(&App::OnEvent, this);

하지 않습니다. 나는 과부하 된 기능의 주소를 올바르게 지정하지 않기 때문에 그것의 생각을합니다.

이제이 모든 것을 테디 베어에게 설명했습니다. 제 질문은 "과부하 또는 템플릿 멤버 기능에 대한 기능 포인터를 올바르게 작성 하고이 포인터를 바인딩하는 방법"이라고 생각합니다.

도움이 되었습니까?

해결책

과부하 된 기능의 주소를 명확하게 설명해야한다고 생각합니다. 올바른 매개 변수가있는 기능 포인터를 명시 적으로 캐스팅하여이를 수행 할 수 있습니다.

boost::bind( static_cast<void (App::*)( MyEvent& )>(&App::OnEvent) , this, _1);

gamedev.net의 유사한 문제 + 솔루션

다른 팁

당신은하고 싶을 것입니다

boost::function<void (const MyEvent&)> g = boost::bind(&App::OnEvent, this, _1);

G (이벤트)를 할 수 있어야합니다. 그것으로

나는 당신이 여기서 무엇을 달성하려고하는지 잘 모르겠지만 지금은 문제 중 하나를 해결해야합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top