C++ 提升。精神。业力设定精度

C++ 提升。精神。业力设定精度,c++,boost,printf,boost-spirit-karma,C++,Boost,Printf,Boost Spirit Karma,我开始使用Karma generate特性,使用类似sprintf的功能将double转换为char。 为此,我使用以下示例: template <typename T> class double3_policy : public boost::spirit::karma::real_policies<T> { public: template <typename T> static unsigned int precision(T) {

我开始使用Karma generate特性,使用类似sprintf的功能将double转换为char。 为此,我使用以下示例:

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';
模板
阶级双重3_政策:公共激励::精神::因果报应::真正的_政策
{
公众:
模板
静态无符号整数精度(T)
{
返回3;
}
};
typedef boost::spirit::karma::real_生成器double3_type;
双3_型常数双3;
使用boost::spirit::karma::left_align;
使用boost::spirit::karma::generate;
char*p=缓冲区;

generate(p,“[”Karma生成器都是关于使用(编译时!)表达式模板指定语法的,比如

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

我建议使用

  • printf
  • Boost格式(具有更多功能的“安全printf”)
  • 快速格式()

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

这里有一个SSCCE,它实际起作用: