我正在使用boost spirit 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)
它按预期工作(但由于程序设计较大,这是不可能的)。
提前致谢。
答案 0 :(得分:4)
正如Igor R.在评论中所指出的那样,您的原始错误是由于phoenix::bind
默认复制其参数而boost::signal
是不可复制的。当您使用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)
]
)
);
}