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