【问题标题】:Mixed units with boost::units带有 boost::units 的混合单位
【发布时间】:2017-01-05 16:55:12
【问题描述】:

在我的程序中,我想利用 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);

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

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

【问题讨论】:

    标签: c++ boost-units


    【解决方案1】:

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

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

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

    【讨论】:

    • 像你建议的转换(虽然很漂亮)或quantity&lt;kiloforce&gt;(my_force).value() 是我试图避免的。在km * kg / s2 中表达g 感觉有点hacky……它可能会干扰其他不涉及力的计算。
    • 接受答案,因为它解释说“它不能按照我要求的方式完成”,一段时间后我意识到这是正确的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-05
    • 2022-01-01
    • 1970-01-01
    • 2010-09-26
    相关资源
    最近更新 更多