在我的程序中,我想利用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所解释的那样。
答案 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);
不要问我为什么用千分之二秒的平方表示地球的加速度,但是千牛顿每公里一公里的千克。