【问题标题】:Bind a boost signal with phoenix bind用phoenix bind绑定一个boost信号
【发布时间】:2013-04-28 18:17:57
【问题描述】:

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

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

请注意,如果我将 phoenix bind 行替换为

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

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

提前致谢。

【问题讨论】:

  • 如果您将上面的行更改为` boost::bind(boost::ref(sig), _1) `(包括适当的标题),它将编译。但是,由于某种原因,我没有设法通过 ref 与 phoenix 传递 sig

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


【解决方案1】:

正如 Igor R. 在 cmets 中所指出的,您最初的错误是由于 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)
             ]
         )
     ); 
 }

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多