boost :: bind & boost :: 기능 포인터 오버로드 또는 템플릿 멤버 함수
-
20-09-2019 - |
문제
콜백 메커니즘이 있습니다. 관련된 클래스는 다음과 같습니다.
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);
다른 팁
당신은하고 싶을 것입니다
boost::function<void (const MyEvent&)> g = boost::bind(&App::OnEvent, this, _1);
G (이벤트)를 할 수 있어야합니다. 그것으로
나는 당신이 여기서 무엇을 달성하려고하는지 잘 모르겠지만 지금은 문제 중 하나를 해결해야합니다.
제휴하지 않습니다 StackOverflow