буст-единицы - с использованием безразмерного типа произвольной системы - PullRequest
6 голосов
/ 18 февраля 2011

Я пытаюсь создать размерный векторный класс с буст-единицами, например,

//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 ]

4 голосов
/ 18 февраля 2011

Хорошо, после изучения деталей библиотеки (и изучения 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
 };
0 голосов
/ 18 февраля 2011

Я могу ошибаться в деталях Boost, но условно double - это безразмерный тип.

...