boost :: bind&boost ::函数指针指向重载或模板化的成员函数

swa*_*rat 14 c++ templates boost member-function-pointers

我有一个回调机制,涉及的类是:

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>);
}
Run Code Online (Sandbox Code Playgroud)

首先这个代码不能编译,这是一个例子.

模板的使用使我的例子变得复杂,但是我把它们留下了,因为它影响了我的问题.我似乎确定我的订阅需要模板化,因为Connector类不知道它处理了多少事件类型.当我尝试创建一个:

boost::function f = &App::OnEvent, 
Run Code Online (Sandbox Code Playgroud)

我尝试使用特化创建OnEvent作为模板函数,但似乎编译器将我的OnEvent函数视为重载而不是模板特化,否则如果我尝试将其明确声明为,则不会在命名空间错误中获取模板特化

template <> OnEvent(const MyEvent& e) ...
Run Code Online (Sandbox Code Playgroud)

我可以得到以下代码来编译:

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

编译,运行和工作.

boost::function<void (const MyEvent&)> g = boost::bind(&App::OnEvent, this);
Run Code Online (Sandbox Code Playgroud)

才不是.我认为是因为我没有正确指定重载函数的地址.

现在已经向泰迪熊解释了这一切 - 我认为我的问题是"如何正确创建一个指向重载或模板化成员函数的函数指针并将此指针绑定到它?"

chr*_*r_f 32

我认为你需要消除重载函数的地址歧义.您可以通过将函数指针显式地转换为具有正确参数的函数指针来完成此操作.

boost::bind( static_cast<void (App::*)( MyEvent& )>(&App::OnEvent) , this, _1);
Run Code Online (Sandbox Code Playgroud)

gamedev.net上的类似问题+解决方案