这个boost :: signals2实现有什么问题,使用参数?

时间:2014-06-21 22:02:28

标签: c++ c++11 boost signals

我正在使用boost :: signals2 :: signal实现一个Dispatcher类。到目前为止,我已经成功使用了没有参数的信号,但是我试图用参数来实现它们。

Dispatcher看起来像这样:

#include "boost/signals2.hpp"

using namespace boost::signals2;

class Dispatcher {
public:
   signal<void ()> signal1;
   signal<void (int)> signal2;
};

有一个Controller类,其函数绑定到从Dispatcher调度的信号:

class Controller {
public:
    void onSignal1() {
        cout << "onSignal1()" << endl;
    }

    void onSignal2(int n) {
        count << "onSignal2()" << n << endl;
    }
};

在主类中Dispatcher信号绑定到Controller函数:

Dispatcher dispatcher;
Controller controller;

dispatcher.signal1.connect(boost::bind(&atlas::Controller::onSignal1, & controller));
dispatcher.signal1();

dispatcher.signal2.connect(boost::bind(&atlas::Controller::onSignal2, & controller, std::_1));
dispatcher.signal2(42);

这不会编译。这是错误: /boost/boost/bind/bind.hpp:313:9:没有匹配函数来调用'boost :: _ mfi :: mf1'类型的对象

如果主文件的最后两行被注释掉,一切都按预期工作。只有当我尝试将第二个信号连接到函数onSignal2时才会发生故障。

1 个答案:

答案 0 :(得分:0)

你必须使用它:

dispatcher.signal2.connect(boost::bind(&atlas::Controller::onSignal2, & controller, _1));

而不是:

dispatcher.signal2.connect(boost::bind(&atlas::Controller::onSignal2, & controller, std::_1));

<强>原理

你必须使用boost占位符而不是std占位符(因为你使用的是boost :: bind而不是std :: bind) http://www.boost.org/doc/libs/1_57_0/boost/bind/placeholders.hpp http://en.cppreference.com/w/cpp/utility/functional/placeholders