0

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

现在我可以写这样的代码

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

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

毕竟,“公斤”就是这种情况,所以我研究了scaled units,但我似乎找不到让它起作用的方法。这个想法本来是定义一个自定义系统,但由于质量、力和压力是相互关联的,所以这是不可能的,正如这里解释的那样。

4

1 回答 1

0

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

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

物理问题似乎是“千力”。物理学不是这样运作的。部队没有前缀,单位有。例如长度与米/公里和质量与克/千克。同样,力 vs Nnewton/kiloNewton。

也就是说,我可以建议

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

不要问我为什么要用千米每平方秒来表示地球的加速度,但千牛顿千米每平方秒。

于 2017-01-05T17:40:14.760 回答