用凤凰绑定绑定一个提升信号

时间:2013-04-28 18:17:57

标签: c++ boost boost-spirit-qi boost-phoenix boost-signals

我正在使用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)

它按预期工作(但由于程序设计较大,这是不可能的)。

提前致谢。

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)
             ]
         )
     ); 
 }