我想在项目中使用boost::units
来使用单位系统之间的维度分析和自动转换。我想在代码中用标准工程单位表示数量,这些单位通常是其他单位的缩放版本。让我用一个例子解释一下。
假设我定义了以下系统
typedef make_system<
us::foot_base_unit,
us::pound_base_unit,
si::second_base_unit>::type my_system;
BOOST_UNITS_STATIC_CONSTANT(feet,length);
BOOST_UNITS_STATIC_CONSTANT(pound,mass);
然后长度单位将以英尺为单位,力量位于lb*ft*s^-2
,压力位于lb*ft^-1*s^-2
。
但是,我想使用磅力单位的力和PSI的压力,这是每平方英寸的磅力。我以为我可以使用缩放单位来表达这些并将它们互换使用但这似乎并非如此。
我试过了:
struct poundforcescale {
typedef double value_type;
double value() const { return 32.174049; }
};
typedef make_scaled_unit<force, poundforcescale>::type poundForce;
namespace boost {
namespace units {
std::string name_string(const field::poundForce&) { return "pound-force"; }
std::string symbol_string(const field::poundForce&) { return "lbf"; }
}
}
哪个编译没有问题。但是当我尝试使用这样的缩放单位时:
poundForce poundForceInst;
quantity<field::poundForce> f2 = 1*poundForceInst;
quantity<field::force> f3 = f2;
编译失败,并且没有可行的转换错误&#34;。我认为缩放单位的重点是自动进行这些转换。而且文档让我觉得我只需要定义name_string和symbol_string就可以打印磅力量了,但是这个
std::cout << "f2 = " << f2 << std::endl;
在boost :: units :: scale_list_dim&#34;中产生了一个&#34;没有成员命名符号;错误。显然超载这些功能并不适用于缩放单位。
也许我应该定义另一个这样的系统
typedef make_system<
us::foot_base_unit,
us::pound_force_base_unit,
si::second_base_unit>::type my_system;
但如果我想以英尺为单位表示长度,以psi表示压力,我还是需要转换。
如果有人有更好的解决方案,我会很高兴。