提升,精神,业力设定精准
Boost.Spirit.Karma set precision
我开始使用Karma的生成功能,将双精度转换为字符与sprintf类似的功能。为此,我使用了以下示例:
template <typename T>
class double3_policy : public boost::spirit::karma::real_policies<T>
{
public:
template <typename T>
static unsigned int precision(T)
{
return 3;
}
};
typedef boost::spirit::karma::real_generator<double, double3_policy<double> > double3_type;
double3_type const double3 ;
using boost::spirit::karma::left_align;
using boost::spirit::karma::generate;
char *p = buffer;
generate(p, '[' << left_align(14)[double3] << left_align(14)[double3] << ']', 12345.000, 22/7.0);
*p = ' ';
这个例子工作得很好,但是precision方法是静态的,我不知道如何动态地设置该值。我想为每次使用指定精度,在执行时更改它。我不介意一开始就创建所有的生成器,因为我想要一个定义好的精度数。
问题是,当它们之间的唯一区别是返回一个数字时,我不认为我必须为每个精度数字创建一个类。我试图用一个成员方法来编译类(如果这是一个成员精度方法,对我来说就足够了),我认为我被这个类方法问题困住了。
我如何创建生成器对象与不同的精度,只是使用他们没有创建多个类?如果我只使用一个生成器,只更改一个属性就更好了。
如果有人有同样的问题,可以分享解决方案将非常有帮助。
谢谢,
Karma生成器都是关于使用(编译时!)表达式模板指定语法的,就像嵌入式DSL。
这确实使它不太适用于动态格式规范。
建议使用
- printf
- Boost格式(具有更多功能的"安全打印")
- FastFormat (http://www.fastformat.org/)
我能看到Karma工作的唯一方法是为real-printing创建一个自定义指令,它将精度作为一个额外的参数。这是不值得的(而且它会扼杀您在这里使用Karma的唯一好处:性能)。
相关文章:
- 提升精神:解析布尔表达式并简化为规范范式
- 如何克服提升精神AST混乱
- 提升精神 x3 - 懒惰解析器
- 提升精神 x3 解析为结构,如果它为空,则跳过成员
- 提升用于解析标题列的精神语法
- 卡在移植遗留的提升::精神代码
- 提升精神 V2 Qi 语法线程安全吗?
- 如何编写具有提升精神的"c like if"解析器
- 为什么要提升精神 lex 挂而不是解析错误?
- 提升精神:如何在使用文本说明符解析双打列表时使用自定义逻辑
- 提升精神 QI:在元组上自动规则演绎,在替代函数中带有序列
- 提升精神解析字符串以前缀开头
- 提升精神 x3 错误处理程序与期望
- 将输入映射到提升精神的 ast 类型
- 提升精神 X3 eol 意外行为
- 在解析器中提升精神分裂
- 提升::精神::qi::语法和可变参数模板
- 提升精神模板专业化失败
- 使用提升精神的递归 BNF 规则
- 提升精神:将结果复制到字符串向量中