#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