c++ - 使用 Phoenix Bind 绑定(bind) boost 信号

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

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

相关文章:

c++ - 迭代第二个循环,在 CUDA 中减少总和

c# - 如何在不混淆的情况下监视用户对 .NET Web 浏览器控件的操作?

c++ - 避免一千个 if 语句的最佳方法?

c++ - 从排列的解析器表达式列表中动态(在运行时)生成 Spirit 解析器表达式

c++ - 解析所需的 boost Spirit 中的临时属性

c++ - 从灵气中制作共享指针的 vector

c++ - 通过实现两个 const 不同的函数来避免代码重复

javascript - asm.js Module.ccall/Module.cwrap 回调

c++ - gcc 的 boost::variant 链接器错误

c++ - cgi 不适用于 boost 正则表达式