Я хотел бы создать общий класс вектора и создать специализации для нескольких случаев. Что-то вроде этого (это не компилируется, но, надеюсь, передает мои намерения):
template<int dim, typename T = float>
class Vector
{
public:
typedef Vector<dim, T> VecType;
Vector() { /**/ }
Vector(const VecType& other) { /**/ )
Vector& operator=(const VecType& other) { /**/ }
VecType operator+(const VecType& other) { /**/ }
VecType operator-(const VecType& other) { /**/ }
T operator*(const VecType& other) { /**/ }
private:
std::array<T, dim> elements;
};
template<int dim, typename T>
class Vector<2>
{
public:
T x() const { return elements[0]; }
T y() const { return elements[1]; }
};
template<int dim, typename T>
class Vector<3>
{
public:
T x() const { return elements[0]; }
T y() const { return elements[1]; }
T z() const { return elements[2]; }
};
Другими словами, я хочу, чтобы тип элементов по умолчанию был float
, и я хочу иметь x()
и y()
методы доступа для случая dim = 2
, и x()
, y()
и z()
для случая dim = 3
. Меня немного смущают сообщения об ошибках:
vector.h:56:10: error: declaration of 'int dim'
vector.h:6:10: error: shadows template parm 'int dim'
(то же самое для T
).
Как правильно это сделать? (если это возможно)