Использование printf с boost :: units :: values

boost :: библиотека единиц обеспечивает хороший способ записи количественных значений в поток, смотри например.

Могу ли я использовать printf со значениями количества вместо выходного потока? У меня есть достаточное количество кода, который хорошо отформатировал вывод с помощью printf, и я хотел бы сохранить форматирование. Передача количества в слово

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

бросает предупреждение

предупреждение: формат «% e» ожидает аргумент типа «double», но аргумент 2
имеет тип
«повышение :: единиц :: количество<повышение :: единиц :: блок<повышение :: единиц :: список<повышение :: единиц :: тусклый<повышение :: единиц :: length_base_dimension,
повышение :: единиц :: static_rational<-0x00000000000000003l> >,
повышение :: единиц :: список<повышение :: единиц :: тусклый<повышение :: единиц :: mass_base_dimension,
повышение :: единиц :: static_rational<1л> >,
повышение :: единиц :: dimensionless_type> >,
повышение :: единиц :: homogeneous_system<повышение :: единиц :: список<повышение :: единиц :: си :: meter_base_unit,
повышение :: единиц :: список<повышение :: единиц :: scaled_base_unit<повышение :: единиц :: СГС :: gram_base_unit,
повышение :: единиц :: масштаб<10л, буст :: единицы :: статические_рациональные<3л>
> >, повысить :: единицы :: список<повышение :: единиц :: си :: second_base_unit,
повышение :: единиц :: список<повышение :: единиц :: си :: ampere_base_unit,
повышение :: единиц :: список<повышение :: единиц :: си :: kelvin_base_unit,
повышение :: единиц :: список<повышение :: единиц :: си :: mole_base_unit,
повышение :: единиц :: список<повышение :: единиц :: си :: candela_base_unit,
повышение :: единиц :: список<повышение :: единиц :: угол :: radian_base_unit,
повышение :: единиц :: список<повышение :: единиц :: угол :: steradian_base_unit,
повышение :: единиц :: 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

0

Решение

Список спецификаторов формата определяется языком. "%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());
}

но не намного Если, конечно, вы не хотите использовать потоки.

4

Другие решения

Других решений пока нет …