2

我正在使用 boost spirit qi 解析入站数据,然后根据其内容发送正确的功能。

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

这不编译,吐出一堵错误墙。

请注意,如果我将凤凰绑定线替换为

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

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

提前致谢。

4

1 回答 1

4

正如 Igor R. 在评论中指出的那样,您最初的错误是由于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)
             ]
         )
     ); 
 }
于 2013-04-28T19:57:09.677 回答