C++ 用phoenix Bind绑定一个升压信号

C++ 用phoenix Bind绑定一个升压信号,c++,boost,boost-spirit-qi,boost-phoenix,boost-signals,C++,Boost,Boost Spirit Qi,Boost Phoenix,Boost Signals,我使用boost spirit qi解析入站数据,然后根据其内容发送正确的功能 我正在使用boost::signals管理回调;我的问题是,我似乎无法将phoenix bind与升压信号结合使用 考虑以下测试用例: #include <boost/signals.hpp> #include <boost/spirit/include/qi.hpp> #include <boost/spirit/include/phoenix_bind.hpp> #i

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

我正在使用
boost::signals
管理回调;我的问题是,我似乎无法将phoenix bind与升压信号结合使用

考虑以下测试用例:

 #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)
             ]
         )
     ); 
 }
它按预期工作(但是由于程序的较大设计,这是不可能的)


提前感谢。

正如Igor R所指出的。在评论中,您最初的错误是由于
phoenix::bind
默认情况下复制其参数,并且
boost::signal
不可复制。当您使用
phoenix::ref
解决此问题时,会出现另一个错误,这是由Boost.phoenix v2无法找到返回的类型引起的。这也可以通过定义
BOOST\u SPIRIT\u USE\u PHOENIX\u 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)
             ]
         )
     ); 
 }
#包括
#定义增强\u精神\u使用\u凤凰\u V3
#包括
#包括
#包括
#包括
无效f(内部i){

std::cout正如Igor R所指出的。在评论中,您最初的错误是由于
phoenix::bind
默认复制其参数,并且
boost::signal
s不可复制。当您使用
phoenix::ref
解决此问题时,会出现另一个错误,这是由boost引起的。phoenix v2无法找到返回的这也可以通过定义
BOOST\u SPIRIT\u USE\u PHOENIX\u 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)
             ]
         )
     ); 
 }
#包括
#定义增强\u精神\u使用\u凤凰\u V3
#包括
#包括
#包括
#包括
无效f(内部i){

std::cout如果您将上面的行更改为'boost::bind(boost::ref(sig),_1)`(包括适当的头文件),它将被编译。但是,由于某种原因,我没有设法通过phoenix的ref传递
sig
。如果您将上面的行更改为'boost::bind(boost::ref(sig),_1)`,它将被编译(包括适当的标题)。但是,由于某些原因,我没有通过凤凰城的参考号
sig
。+1什么也没说:)(我们刚到目前为止……;我将在促成因素列表中添加“匿名受益人”)啊,默认情况下它仍然是v2…我试图显式地放置phoenix::bind,但它也没有编译。+1没有说什么:)(我们刚刚到目前为止……;我将在促成因素列表中添加“匿名受益人”)啊,默认情况下它仍然是v2…我试图显式地放置phoenix::bind,但它也没有编译。