Привязать сигнал усиления с помощью Phoenix Bind

Я использую Boost Qi для анализа входящих данных, а затем отправляю нужные функции в зависимости от их содержимого.

я использую boost::signals управлять обратными вызовами; моя проблема в том, что я не могу использовать привязку феникса к сигналам буста.

Рассмотрим следующий тестовый пример:

 #include <boost/signals.hpp>

#include <boost/spirit/include/qi.hpp>
#include <boost/spirit/include/phoenix_bind.hpp>
#include <boost/spirit/include/phoenix_core.hpp>

#include <iostream>

void f(int i) {
std::cout << i << '\n';
}

int main() {
boost::signal<void(int)> sig;

sig.connect(f);

std::string s="123";
auto first=s.cbegin(), last=s.cend();

boost::spirit::qi::parse(
first, last,
(
boost::spirit::qi::int_
[
boost::phoenix::bind(sig, boost::spirit::qi::_1)
]
)
);
}

Это не компилируется, выплевывая стену ошибок.

Обратите внимание, что если я заменю строку привязки феникса на

boost::phoenix::bind(&f, boost::spirit::qi::_1)

это работает как ожидалось (однако из-за большего дизайна программы это невозможно).

Заранее спасибо.

2

Решение

Как отметил Игорь Р. в комментариях, ваша первоначальная ошибка была связана с тем, что phoenix::bind копирует свои аргументы по умолчанию и boost::signals не подлежит копированию. Когда вы используете phoenix::ref чтобы решить эту проблему, появляется другая ошибка, вызванная неспособностью Boost.Phoenix v2 найти возвращаемый тип. Это также может быть легко решено путем определения BOOST_SPIRIT_USE_PHOENIX_V3,

 #include <boost/signals.hpp>

#define BOOST_SPIRIT_USE_PHOENIX_V3
#include <boost/spirit/include/qi.hpp>
#include <boost/spirit/include/phoenix_bind.hpp>
#include <boost/spirit/include/phoenix_core.hpp>

#include <iostream>

void f(int i) {
std::cout << i << '\n';
}

int main() {
boost::signal<void(int)> sig;

sig.connect(f);

std::string s="123";
auto first=s.cbegin(), last=s.cend();

boost::spirit::qi::parse(
first, last,
(
boost::spirit::qi::int_
[
boost::phoenix::bind(boost::phoenix::ref(sig), boost::spirit::qi::_1)
]
)
);
}
4

Другие решения

Других решений пока нет …