混合单位与助推::单位

Mixed units with boost::units

本文关键字:单位 位与 单位与 混合      更新时间:2023-10-16

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

现在我可以写这样的代码

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的库交互时,我更喜欢力以千牛顿为单位(同样,压力以兆帕为单位)。所以我这样做:

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);

因为它表示一种隐式转换。那么,我的问题是:有没有一种方法可以配置库,使数量以所选的缩放单位表示?

毕竟,"千克"是这样的,所以我研究了缩放单位,但我似乎找不到让它发挥作用的方法。这个想法本来是定义一个自定义系统,但由于质量、力和压力是相互关联的,这是不可能的,正如这里所解释的。

基本问题似乎是,你正在寻找一个以千牛顿为单位的无量纲力。这并不难:

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

物理问题似乎是"千力"。物理学不是这样运作的。力没有前缀,单位有。例如,长度与米/公里,质量与克/公斤。类似地,力与牛顿/千牛顿。

也就是说,我可以建议吗

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

不要问我为什么你会用每秒平方公里来表示地球的加速度,但千牛顿是每秒平方公里公斤。