【发布时间】:2010-12-27 07:36:36
【问题描述】:
我有一个回调机制,涉及的类有:
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);
没有。我认为这是因为我没有正确指定重载函数的地址。
现在已经向泰迪熊解释了所有这些 - 我认为我的问题是“如何正确创建指向重载或模板化成员函数的函数指针并将 this 指针绑定到它?”
【问题讨论】:
-
我在谷歌上搜索了这个与事件生成完全相同的问题,几率是多少!
标签: c++ templates boost member-function-pointers