C++ 用phoenix Bind绑定一个升压信号
我使用boost spirit qi解析入站数据,然后根据其内容发送正确的功能 我正在使用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::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,但它也没有编译。