我使用boost::units
来处理项目中的单位。
我创建了一个缩放单位来存储微米:
using namespace boost::units;
typedef make_scaled_unit<si::length,
scale<10, static_rational<-6> > >::type micro_meter_unit;
一切都按预期工作:
quantity<si::length, double> some_meter = 10 * si::meter;
quantity<micro_meter_unit, double> some_mu_meter =
static_cast<quantity<micro_meter_unit, double>>(some_meter);
std::cout << "some_meter^2 = " << some_meter * some_meter; // outputs 100 m^2
std::cout << "some_mu_meter^2 = " << some_mu_meter * some_mu_meter; // outputs 1e+014 p(m^2)
然而,平方根操作未编译:
std::cout << "sqrt(some_meter) = " << sqrt(some_meter); // outputs 3.16228 m^(1/2)
std::cout << "sqrt(some_mu_meter) = " << sqrt(some_mu_meter); //error here
// 'value' : is not a member of 'boost::units::scale_dim_tag'
// ...
// see reference to class template instantiation
// 'boost::units::root_typeof_helper<X,Y>' being compiled
//with
//[
// X=boost::units::quantity<pds::ssp::micro_meter_unit,double>,
// Y=boost::units::static_rational<2>
//]
如何以正确的方式定义缩放单位以执行平方根和其他操作?
答案 0 :(得分:1)
看了一下之后,我认为这是一个错误。
文档表明make_scaled_unit的动机是针对system / si / prefixes.hpp中的前缀
例如:
BOOST_UNITS_METRIC_PREFIX(-9, nano);
BOOST_UNITS_METRIC_PREFIX(-6, micro);
BOOST_UNITS_METRIC_PREFIX(-3, milli);
//! The define uses a dimensionless unit to make a scale unit
#define BOOST_UNITS_METRIC_PREFIX(exponent, name) \
typedef make_scaled_unit<dimensionless, scale<10, static_rational<exponent> > >::type name ## _type;\
BOOST_UNITS_STATIC_CONSTANT(name, name ## _type)
然后使用它们:
quantity<si::length, double> mu_meter( 1.0 * si::micro * si::meter );
我们的想法是将输入转换为底层系统的长度类型,然后处理这些数量,并且只在需要输出时担心转换。
在图书馆的测试覆盖范围内,似乎可能错过了以其他方式使用这种缩放单位的可能性。你应该将它发布到boost trac: