【问题标题】:boost::bind & boost::function pointers to overloaded or templated member functionsboost::bind & boost::function 指向重载或模板化成员函数的指针
【发布时间】: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


【解决方案1】:

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

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

Similar problem + solution on gamedev.net

【讨论】:

  • 很遗憾你只能得到一个被接受的答案,但这是我错过的部分。感谢您的链接。
  • 很高兴我再次需要这个答案,因为我有足够的声誉来投票!
【解决方案2】:

你会想要做的

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

你应该可以做 g(event);与那个

我不太确定您要在这里完成什么,但现在应该可以解决您的一个问题。

【讨论】:

  • 我试过了,我认为这是正确使用bind,问题是“没有匹配的函数调用到bind(, App* const, boost::arg &). 我还尝试在 App 类中使用模板化 OnEvent 来执行此操作,以便通过为我希望订阅的事件提供参数类型的专门化并明确指定模板参数来解决此问题。但我还没有弄清楚那个。
  • 该代码将使 g(event) 工作,但它不能完全适用于我认为你想要的模板。如果您正在尝试做我认为您正在尝试做的事情,那么最好忘记该模板并改用事件接口声明。我很想看看 boost::function 如何与模板函数定义一起工作,但我认为这是不可能的。您可能想查看 lib 目录中的 Boost::Fusion 和 Interpreter 示例。它是我所知道的最先进的 Boost::function 实现器。 libs/function_types/example/interpreter.hpp
  • 我从 OnEvent 端删除了模板(订阅仍然是模板化的),它适用于一个事件。但是一旦我重载OnEvent,它就不能再推断出哪一个了。我明白为什么,因为函数指针知道它的类型,但 boost::bind 不知道。
猜你喜欢
  • 1970-01-01
  • 2013-09-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多