使用带有boost :: units :: quantity值的printf

时间:2012-12-19 18:46:02

标签: c++ boost formatting boost-units

boost::units library提供了一种将数量值写入流see for example的好方法。

我可以将printf与数量值一起使用而不是使用输出流吗?我有相当数量的代码,使用printf很好地格式化输出,我想保持格式。将数量传递给说

quantity<mass_density> rho = 1.0 * mass_density;
printf("rho %6.2e\n", rho);

抛出警告

  

警告:格式'%e'需要类型为'double'的参数,但参数为2   有类型   “增强::单元::量&LT;升压::单元::单元&LT;升压::单元::列表&LT;升压::单元::暗淡&LT;升压::单元:: length_base_dimension,   升压::单元:: static_rational&LT; -0x00000000000000003l&GT; &gt;中   升压::单元::列表&LT;升压::单元::暗淡&LT;升压::单元:: mass_base_dimension,   升压::单元:: static_rational&LT;1升&GT; &gt;中   升压::单元:: dimensionless_type&GT; &gt;中   升压::单元:: homogeneous_system&LT;升压::单元::列表&LT;升压::单元:: SI :: meter_base_unit,   升压::单元::列表&LT;升压::单元:: scaled_base_unit&LT;升压::单元:: CGS :: gram_base_unit,   boost :: units :: scale&lt; 10l,boost :: units :: static_rational&lt; 3l&gt;   &GT; &gt;,boost :: units :: list&lt; boost :: units :: si :: second_base_unit,   提高::单位::列表&LT;提高::单位:: SI :: ampere_base_unit,   提高::单位::列表&LT;提高::单位:: SI :: kelvin_base_unit,   提高::单位::列表&LT;提高::单位:: SI :: mole_base_unit,   提高::单位::列表&LT;提高::单位:: SI :: candela_base_unit,   升压::单元::列表&LT;升压::单元::角度:: radian_base_unit,   升压::单元::列表&LT;升压::单元::角度:: steradian_base_unit,   升压::单元:: dimensionless_type&GT; &GT; &GT; &GT; &GT; &GT; &GT;   &GT; &GT; &GT; &GT; &gt;'[ - 格式化]

我可以使用rho.value()代替,但我想尽可能输出单位(即使我更新了格式字符串)。

我认为答案就在这里,http://www.boost.org/doc/libs/1_52_0/doc/html/boost_units/Reference.html#header.boost.units.io_hpp

1 个答案:

答案 0 :(得分:4)

格式说明符列表由语言修复。 "%e"输出double"%d"输出int等。没有任何内容会输出quantity<mass_density>类型的对象或类类型的任何其他对象

你可以拥有:

template <typename Unit, typename T>
string symbolic_units(const quantity<Unit, T> &)
{
    return symbol_string(Unit());
}

int main()
{
    quantity<mass_density> x;
    x = 3.72 * kilogram_per_cubic_meter;

    printf ("%g %s\n", x.value(), symbolic_units(x).c_str());
}

但不多。除非你愿意使用溪流。