在我的程序中,我想利用 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,但我似乎找不到让它起作用的方法。这个想法本来是定义一个自定义系统,但由于质量、力和压力是相互关联的,所以这是不可能的,正如这里解释的那样。