gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 01:10:07 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com