Я использую 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)
это работает как ожидалось (однако из-за большего дизайна программы это невозможно).
Заранее спасибо.
Как отметил Игорь Р. в комментариях, ваша первоначальная ошибка была связана с тем, что phoenix::bind
копирует свои аргументы по умолчанию и boost::signal
s не подлежит копированию. Когда вы используете 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)
]
)
);
}
Других решений пока нет …