0

boost::units 库提供了一种将数量值写入流的好方法,请参见示例

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

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

抛出警告

警告:格式“%e”需要“double”类型的参数,但参数 2 的类型为“boost::units::quantity<boost::units::unit<boost::units::list<boost::units: :dim<boost::units::length_base_dimension, boost::units::static_rational<-0x00000000000000003l> >, boost::units::list<boost::units::dim<boost::units::mass_base_dimension, boost: :units::static_rational<1l> >, boost::units::dimensionless_type> >, boost::units::homogeneous_system<boost::units::list<boost::units::si::meter_base_unit, boost:: units::list<boost::units::scaled_base_unit<boost::units::cgs::gram_base_unit, boost::units::scale<10l, boost::units::static_rational<3l> >>, boost:: units::list<boost::units::si::second_base_unit, boost::units::list<boost::units::si::ampere_base_unit, boost::units::列表<boost::units::si::kelvin_base_unit, boost::units::list<boost::units::si::mole_base_unit, boost::units::list<boost::units::si::candela_base_unit , boost::units::list<boost::units::angle::radian_base_unit, boost::units::list<boost::units::angle::steradian_base_unit, boost::units::dimensionless_type> > > > > > > > > > > >' [-Wformat]

我可以改用 rho.value() ,但如果可能的话,我想输出单位(即使我已经更新了格式字符串)。

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

4

1 回答 1

4

格式说明符列表由语言固定。"%e"输出 a double"%d"输出 anint等。没有任何东西会输出 type 的对象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());
}

但不多。除非您当然愿意使用流。

于 2012-12-19T20:01:11.773 回答