Если вы хотите общий интерфейс, определить конструктор, как имеющие 4 аргументов и специализироваться его. Внутри инициализировать только те элементы, которые действительны для вектора такого размера:
template <>
Vector<1>::Vector(int _x, int _y, int _z, int _w)
: x(_x) //1D vector has only 'x'
{
}
template <>
Vector<2>::Vector(int _x, int _y, int _z, int _w)
: x(_x)
, y(_y) //2D vector has 'x' and 'y'
{
}
и т.д. Но это некрасиво, заставляет вас совершать какие-то вещи «общие», например, вы будете держать 4
компонент даже для 2D vector
, Существуют обходные пути (шаблонная структура, используемая как переменная-член, специализированная для вектора каждого размера), но это довольно сложно. Так как векторы разного размера фактически различных типов, я пошел бы для полного класса специализации:
template<int size>
class Vector;
template<>
class Vector<1>
{
protected:
int x;
public:
Vector(int _x)
: x(_x)
{ }
//other members
};
template<>
class Vector<2>
{
protected:
int x, y;
public:
Vector(int _x, int _y)
: x(_x)
, y(_y)
{ }
//other members
};
Затем вы можете использовать его таким образом:
Vector<1> v_1(2);
Vector<2> v_2(4, 6);
//etc...
Кроме того, второе решение позволит клиентам вашего вектора, чтобы создать экземпляр только для тех size
s, которые вы явно разрешите.
Ваш класс 'Вектор <2>' не имеет никакого отношения к '' Vector <3>, они имеют разные типы. Для каждого экземпляра шаблона определяется конструктор, поэтому вы в порядке. Возможно, вы хотите сделать что-то еще, так как я не вижу, чтобы вы использовали «размер» где угодно. Если да, уточните этот вопрос. – vsoftco
спасибо за ответ, я получу свой ответ. – user3877301