【问题标题】:Using printf with boost::units::quantity values将 printf 与 boost::units::quantity 值一起使用
【发布时间】:2012-12-19 18:46:02
【问题描述】:

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

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

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

抛出警告

警告:格式“%e”需要“double”类型的参数,但参数 2 有类型 'boost::units::quantity<:units::unit boost::units::static_rational>>, boost::units::list<:units::dim boost::units::static_rational>>, boost::units::dimensionless_type>>, boost::units::homogeneous_system<:units::list boost::units::list boost::units::scale boost::units::static_rational> >>, boost::units::list<:units::si::second_base_unit boost::units::list 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

【问题讨论】:

  • 如果你打算使用一些 C++ 特性,比如 Boost 单元,你可能想要使用其他特性,比如流。大多数 Boost 类都有流操作符 IIRC 的重载。如果您需要 printf 语法,Boost 提供了一个基于流的库,它采用格式字符串。
  • @peachykeen 是说我应该使用流以与 boost 保持一致吗?
  • 我建议使用流或 Boost 的 C++ printf 库,是的。尽管它不是一个全局解决方案(可变参数在 C++ 样式的打印中更困难),但它更符合习惯并能帮助您避免这样的头痛。
  • @peachykeen 不幸的是,这就是我想要保留的,一个带有可变参数的自定义 printf。我可以失去它,但不是世界末日

标签: c++ boost formatting boost-units


【解决方案1】:

格式说明符列表由语言固定。 "%e" 输出 double"%d" 输出 int 等。没有任何东西会输出 quantity&lt;mass_density&gt; 类型的对象或任何其他类类型的对象。

你可以有这个:

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-05
    • 2013-12-01
    • 2013-10-08
    • 1970-01-01
    • 2017-12-27
    • 1970-01-01
    • 2011-04-17
    • 2016-08-19
    • 2019-03-17
    相关资源
    最近更新 更多