0
#include <iostream>
#include <boost/units/quantity.hpp>
#include <boost/units/systems/si/length.hpp>

using namespace boost::units;

struct bu1 : base_unit<bu1, length_dimension, 2001> {};
struct bu2 : base_unit<bu2, length_dimension, 2002> {};

BOOST_UNITS_DEFINE_CONVERSION_FACTOR(bu1, bu2, double, 1.5);

#if 1
BOOST_UNITS_DEFINE_CONVERSION_FACTOR(bu2, bu1, double, 4.0);
#endif

int main(int argc, char *argv[])
{
  quantity<bu1::unit_type> output(1 * bu2::unit_type());

  //  prints 4 or 0.67
  std::cout << output.value() << std::endl;

  return 0;
}

代码打印4或打印0.666667取决于是否定义了第二个转换因子。这应该是设计使然吗?物理学中没有两个这样的单位需要不同的转换因子,是吗?

4

1 回答 1

0

这是一种垃圾输入/垃圾输出行为。您确实意识到 1.0 / 1.5 != 4.0,不是吗?第二个转换因子,如果要明确的话,应该是 (2.0/3.0),而不是 4。

定义的第一个转换因子规范已经双向工作了。从文档中

如果目标单位是一个基本单位或一个只包含一个基本单位的单位,该单位被提升到第一个幂(例如英尺->米),则不需要明确定义相反的(米->英尺)。

有人可能会争辩说存在某种错误,它甚至允许您指定与第一个不一致的第二个转换因子。

另外,我希望您在生产代码中使用 < boost/units/io.hpp >,为您的单位指定名称/符号,而不是像output.value(). 我知道你的问题的方式更短,当然......

于 2013-10-11T11:10:38.733 回答