我有一个回调机制,所涉及的类是:
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>);
}
首先这个代码不能编译,这是一个例子。
模板的使用使我的例子变得复杂,但是我把它们留下了,因为它影响了我的问题。我似乎确定我的订阅需要模板化,因为Connector类不知道它处理了多少事件类型。当我尝试创建一个:
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);
没有。我认为是因为我没有正确指定重载函数的地址。
现在已经向泰迪熊解释了这一切 - 我认为我的问题是“如何正确创建指向重载或模板化成员函数的函数指针并将此指针绑定到它?”
答案 0 :(得分:32)
我认为您需要消除重载函数的地址歧义。您可以通过将函数指针显式地转换为具有正确参数的函数指针来完成此操作。
boost::bind( static_cast<void (App::*)( MyEvent& )>(&App::OnEvent) , this, _1);
答案 1 :(得分:4)
你想要做
boost::function<void (const MyEvent&)> g = boost::bind(&App::OnEvent, this, _1);
你应该能够做g(事件);那个
我不太确定你要在这里完成什么,但是现在应该解决你的一个问题。