gpt4 book ai didi

c++ - 在 boost::spirit 的 assign_a 中缩放

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:37:31 27 4
gpt4 key购买 nike

我正在研究 boost::spirit 以解析基于 ASCII 的协议(protocol)。我设法使用如下规则从行中提取值:

rule<> Speed = uint_parser<unsigned int,10,3,3>()[assign_a(buffer.speed)];

我也成功地将这些规则以有意义的方式联系起来。完美的一天缺少以下内容:数据值是需要使用固定转换因子(通常是 10 的幂)转换为浮点值的整数。

我现在所做的只是在解析后应用这些缩放因子。但是,我真的很感激将比例因子包含在该字段的规则定义中。我想象这样的事情:

rule<> Speed = uint_parser<unsigned int,10,3,3>()[assign_a(buffer.speed,100)];

有什么建议吗?

提前致谢阿恩

最佳答案

一种方法是使用 Boost.Phoenix .包括这些 header :

#include <boost/spirit/include/phoenix_core.hpp>
#include <boost/spirit/include/phoenix_object.hpp> // For static_cast_
#include <boost/spirit/include/phoenix_operator.hpp> // For multiplication

然后使用类似的东西:

using namespace boost::phoenix;
using namespace boost::phoenix::arg_names;

rule<> Speed = uint_parser<unsigned int,10,3,3>()[
ref(buffer.speed) = static_cast_<double>(arg1) * 100
];

不过,我发现 phoenix 使用起来有点棘手,通常只是 write my own action :

struct assign_scaled
{
double& result;
double scale;

assign_with_scale(double& r, double scale) : result(r), scale(scale) {}

void operator()(unsigned int x) const
{
result = static_cast<double>(x) * scale;
}
};

然后像这样使用它:

    rule<> Speed = uint_parser<unsigned int,10,3,3>()[assign_scaled(buffer.speed, 100)];

这可能更冗长,但我发现它更易于维护。

关于c++ - 在 boost::spirit 的 assign_a 中缩放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1012803/

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