增强单位的平方根scaled_unit

时间:2014-07-28 16:22:36

标签: c++ boost

我使用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>
//]

如何以正确的方式定义缩放单位以执行平方根和其他操作?

1 个答案:

答案 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:

https://svn.boost.org/trac/boost/