Что не так с этой реализацией boost:: signals2 с использованием параметров?

#c #c 11 #boost #signals

#c #c 11 #повышение #сигналы

Вопрос:

Я реализую класс диспетчера, используя boost:: signals2::signal. До сих пор я успешно использовал сигналы без параметров, но я натыкаюсь на стену, пытаясь реализовать их с помощью параметров.

Диспетчер выглядит так:

 #include "boost/signals2.hpp"

using namespace boost::signals2;

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

Существует класс контроллера, функции которого будут привязаны к сигналам, отправляемым диспетчером:

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

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

В основном классе сигналы диспетчера привязаны к функциям контроллера:

 Dispatcher dispatcher;
Controller controller;

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

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

Это не будет компилироваться. Вот ошибка:
/boost/ boost / bind/ bind.hpp:313:9: Нет соответствующей функции для вызова объекта типа ‘boost::_mfi::mf1’

Если последние две строки основного файла закомментированы, все работает так, как ожидалось. Только когда я пытаюсь подключить второй сигнал к функции onSignal2 , что-то ломается.

Комментарии:

1. Увеличьте привязку и стандартные заполнители? Совместимы ли они?

2. Отлично работает с заполнителями boost

3. Я думаю, что должна быть какая-то несовместимость между платформой или ОС и версией boost, которую я использую. Я скопировал скрипт из созданного вами примера, и он по-прежнему терпит неудачу с точно такой же ошибкой.

4. Не смешивайте boost::bind и std заполнители

5. Не могли бы вы предоставить ссылку на эти примеры? Причина в том, что fact Boost.Bind не распознает std::_1 в качестве заполнителя (см. Boost.Bind Источники). Вы можете попытаться определить признак boost::is_placeholder для стандартных заполнителей, но почему бы вам просто не использовать повышающие? Они находятся в глобальном пространстве имен: _1, _2 и т.д.

Ответ №1:

Вы должны использовать это:

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

Вместо этого:

 dispatcher.signal2.connect(boost::bind(amp;atlas::Controller::onSignal2, amp; 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