带有boost ::单位的混合单位

时间:2017-01-05 16:55:13

标签: c++ boost-units

在我的程序中,我想利用boost ::单元进行类型安全计算和自动转换。作为库的新手用户,我基本了解它的工作原理,以及隐式类型转换为forbidden的原因。

现在我可以编写像这样的代码

using namespace boost::units;
using namespace boost::units::si;

quantity<mass> my_mass(50 * kilogram);
quantity<force> my_force = my_mass * 9.81 * meter / pow<2>(second);

my_mass以千克表示,my_force以牛顿表示。但是为了方便与其他只接受double的图书馆互动时,我更倾向于使用千牛顿(以及MegaPascal中的压力)。所以我这样做:

typedef make_scaled_unit<force, scale<10, static_rational<3>>>::type kiloforce;
quantity<kiloforce> scaled_force(my_mass * 9.81 * meter / pow<2>(second));

哪个有效,但强制进行显式转换。理所当然,以下代码无法编译:

quantity<kiloforce> scaled_force = my_mass * 9.81 * meter / pow<2>(second);

因为它代表隐式转换。我的问题是:有没有办法配置库,以便以所选的缩放单位表示数量?

毕竟,这是“千克”的情况,所以我调查scaled units,但我似乎无法找到一种方法使它工作。这个想法应该是定义一个自定义系统,但由于质量,力和压力是相互关联的,这是不可能的,正如here所解释的那样。

1 个答案:

答案 0 :(得分:0)

基本问题似乎是你正在寻找以千牛顿为单位的无量纲力。这是not hard

quantity<force> my_force = my_mass * 9.81 * meter / pow<2>(second);
double F = my_force / (kilo*newtons); // my_force in kN

物理问题似乎是&#34; kiloforce&#34;。这不是物理学的工作原理。力量没有前缀,单位有。例如。长度与米/公里和质量对克/千克。同样,力量对Nnewton / kiloNewton。

那就是说,我可以建议

make_scaled_unit<acceleration, scale<10, static_rational<3>>>::type g(0.00981);

不要问我为什么用千分之二秒的平方表示地球的加速度,但是千牛顿每公里一公里的千克。