作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在研究 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/
我正在研究 boost::spirit 以解析基于 ASCII 的协议(protocol)。我设法使用如下规则从行中提取值: rule<> Speed = uint_parser()[assign_a
我是一名优秀的程序员,十分优秀!