boost-units - 使用无量纲类型的任意系统

时间:2011-02-18 11:36:36

标签: c++ boost metaprogramming units-of-measurement

我正在尝试使用像这样的增强单位来构建一个带尺寸的矢量类,

//vector will be constructed vec<si::length> v(10, 1.0*si::metre);
template<typename dimension>
class vec
{
  public:
  //constructor setting all values to q.
  vec(const size_t, const boost::units::quantity<dimension> q)
  //etc
}

除了operator*=operator/=进行元素乘法和除法之外,一切正常。由于这些不会改变维度,因此它们仅在乘以/除以无量纲数量时才有意义:我正在努力寻找未锁定到特定系统(例如si或cgs单位)的任意无量纲数量。

我想要类似的东西,

  /** Multiply a dimensionless vector. */
  vec<dimension>& 
  operator*=(const vec<boost::units::dimensionless_type>& b);

或者某些元编程魔法(我注意到boost :: units :: is_dimensionless存在,但我不知道如何使用它,因为我不熟悉一般的元编程技术)

  template<typename dimension>
  template<typename a_dimensionless_type>
  vec<dimension>& 
  vec<dimension>::operator*=(const vec<a_dimensionless_type>& b){
    //some compile time check to make sure that a_dimensionless_type is actually dimensionless?
    //the rest of the function
  }

我想要以下示例来编译

  vec<si::dimensionless> d(10, 2.0);
  vec<si::length>  l(10, 2.0*si::metre);
  l*=d;

  vec<cgs::dimensionless> d2(10, 2.0);
  vec<cgs::length>  l2(10, 2.0*cgs::centimetre);
  l2*=d2;

2 个答案:

答案 0 :(得分:4)

好的,在检查了库的详细信息(并了解了BOOST_MPL_ASSERT)后,结果非常简单。我对图书馆设计师的称赞。

template<typename a_dimensionless_type>
vec<dimension>& 
operator*=(const vec< a_dimensionless_type >& b)
{
    BOOST_MPL_ASSERT(( boost::units::is_dimensionless<boost::units::quantity<a_dimensionless_type>  > )); 
    //the rest of the function
 };

答案 1 :(得分:0)

我可能会误解Boost细节,但传统上double是无量纲类型。