我正在使用 boostspirit qi 来解析入站数据,然后根据其内容分派(dispatch)正确的功能。
我使用 boost::signals
来管理回调;我的问题是我似乎无法将 phoenix bind 与 boost 信号一起使用。
考虑以下测试用例:
#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)
]
)
);
}
这无法编译,抛出一堵错误墙。
请注意,如果我将 phoenix 绑定(bind)线替换为
boost::phoenix::bind(&f, boost::spirit::qi::_1)
它按预期工作(但是由于程序的较大设计,这是不可能的)。
提前致谢。
最佳答案
正如 Igor R. 在评论中指出的,您最初的错误是由于 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)
]
)
);
}
关于c++ - 使用 Phoenix Bind 绑定(bind) boost 信号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16266121/