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);
别问我为什么要用千米每秒平方表示地球加速度,但是一千牛顿是千米千克每秒平方。
在我的程序中,我想利用 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);
别问我为什么要用千米每秒平方表示地球加速度,但是一千牛顿是千米千克每秒平方。