boost::units 的混合单位

Mixed units with boost::units

在我的程序中,我想利用 boost::units 进行类型安全计算和自动转换。作为库的新手,我对它的工作原理有一个基本的了解,以及为什么隐式类型转换是 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 的其他库交互时,我更喜欢力以千牛顿为单位(同样,压力以兆帕为单位)。所以我这样做:

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

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

毕竟"kilogram"就是这样,所以我研究了一下scaled units, but I cannot seem to find a way to make it work. The idea would have been to define a custom system, but since mass, force and pressure are related to each other, this is not possible, as explained here

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

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

物理题好像是"kiloforce"。物理学不是这样运作的。部队没有前缀,单位有。例如。长度与 meter/kilometer 和质量与 gram/kilogram。同样,force vs Nnewton/kiloNewton。

话虽如此,我可以建议

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

别问我为什么要用千米每秒平方表示地球加速度,但是一千牛顿千米千克每秒平方。