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
}

Все работает нормально, кроме оператора * = и оператора / = , которые выполняют поэлементное умножение и деление. Поскольку они не изменяют размерность, они имеют смысл только при умножении / делении на безразмерную величину: я изо всех сил пытаюсь найти произвольную безразмерную величину, которая не привязана к конкретной системе (например, единицы 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;
6
задан Qantas 94 Heavy 19 October 2013 в 02:10
поделиться