Я пытаюсь создать размерный векторный класс с такими модулями повышения,
//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;