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

标签 c++ templates boost pointer-to-member

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

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 指针绑定(bind)到它?”

最佳答案

我认为您需要消除重载函数的地址的歧义。您可以通过将函数指针显式转换为具有正确参数的指针来做到这一点。

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

Similar problem + solution on gamedev.net

关于c++ - boost::bind & boost::function 指向重载或模板化成员函数的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1915880/

相关文章:

c++ - 重载策略类​​模板的成员函数

c - 尝试在 C 中制作模板

c++ - C++ 中的从属名称与非从属名称

c++ - boost asio streambuf 在调用 consume 后不释放内存?

c++ - 在 Release模式下 boost 线程崩溃

c++ - 如何在 C++ 中对派生类使用 Boost 序列化?

c++ - 在 C 中使用指向对象的指针的方法

c# - 为什么 C# 和 VB.NET 隐式编码 char* 不同?

c++ - 无法将复数 <double> 转换为 double

c++ - 将 gzip_compressor 与 boost::iostreams::filtering_wostream 一起使用,编译器错误