2

我开始使用 Karma 生成功能将 double 转换为 char 并具有类似 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 = '\0';

该示例工作正常,但精度方法是静态的,我没有意识到如何动态设置该值。我想为每次使用指定精度,在执行时更改它。我不介意在开始时创建所有生成器,因为我想要定义数量的精度。

问题是当它们之间的唯一区别是返回数字时,我不相信我必须为每个精度数字创建一个类。我试图用一个成员方法编译这个类(如果这对我来说是一个足够的成员精度方法),我想我被困在这个类方法问题上。

如何创建具有不同精度的生成器对象并且只使用它们而不创建一个以上的类?如果我只能使用一个生成器,只需更改一个属性会更好。

如果有人遇到同样的问题并且可以分享解决方案将非常有帮助。

谢谢,

4

1 回答 1

1

Karma 生成器都是关于使用(编译时!)表达式模板指定语法,例如嵌入式 DSL

这确实使它不适用于动态格式规范。

我建议使用

我可以看到 Karma 的这项工作的唯一方法是创建一个用于真实打印的自定义指令,该指令将精度作为一个额外的参数。这是不值得的(它会扼杀你在这里使用 Karma 的唯一好处:性能)。

于 2015-09-28T21:11:25.497 回答