6

我正在尝试使用像这样的 boost-units 创建一个有维度的向量类,

//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;
4

2 回答 2

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
 };
于 2011-02-18T15:31:51.263 回答
0

我可能对 Boost 细节有误解,但通常double是无量纲类型。

于 2011-02-18T13:24:18.643 回答