代码之家  ›  专栏  ›  技术社区  ›  swarfrat

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

  •  14
  • swarfrat  · 技术社区  · 15 年前

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

    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);
    

    没有。我认为这是因为我没有正确地指定重载函数的地址。

    现在向Teddy Bear解释了所有这些之后,我认为我的问题是“如何正确地创建指向重载或模板化成员函数的函数指针并将该指针绑定到它?”

    2 回复  |  直到 13 年前
        1
  •  32
  •   christopher_f    13 年前

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

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

    Similar problem + solution on gamedev.net

        2
  •  4
  •   Charles    15 年前

    你会想做的

    boost::function<void (const MyEvent&)> g = boost::bind(&App::OnEvent, this, _1);
    

    你应该能够做G(事件);用它

    我不太确定你想在这里完成什么,但这应该暂时解决你的一个问题。