Я пытаюсь написать математический векторный класс. Первая версия выглядит так:
template <typename T, unsigned int n>
struct Vector {
Vector<T, n>(T t = T()) // default
{
for (int i = 0; i < n; i++)
{
data[i] = t;
}
}
Vector<T, n>(const Vector<T, n> &aVector)
{
for (unsigned int i = 0; i < n; i++)
{
data[i] = aVector.data[i];
}
}
Vector<T, n>(const T arr[n])
{
for (unsigned int i = 0; i < n; i++)
{
data[i] = arr[i];
}
}
T& operator[](unsigned int i);
const T& operator[](unsigned int i) const;
Vector<T, n>& operator=(const Vector<T, n> &aVector);
void normalise();
T data[n];
};
У меня также есть операторы (+, * и т. д.), объявленные вне класса, а также несколько других классов.
Однако вот в чем дело. Для векторов длины 2, 3, 4 я хотел бы иметь конструктор (или функцию), который принимает x, y (для Vec2), x, y, z или x, y, z, w в качестве параметров.
Однако, кажется, что вы не можете сделать специализированные конструкторы для этой цели. Как мне поступить в таком случае? Должен ли я полностью специализироваться на трех случаях? Разве это не означает, что я должен переписать куски кода?
У меня также есть аналогичный класс Matrix ( Matrix ), и я уверен, что мне понадобятся некоторые конструкторы для вращения, перевода, масштабирования и т. д. Я предполагаю, что мне нужно будет решить аналогичную проблему.
Если ты видишь
У меня также есть операторы (+, * и т. д.), объявленные вне класса, а также пара других функций (точка, крестик и т. д.).
Однако вот в чем дело. Для векторов длины 2, 3, 4 я хотел бы иметь конструктор (или функцию), который принимает x, y (для Vec2), x, y, z или x, y, z, w в качестве параметров.
Однако, кажется, что вы не можете сделать специализированные конструкторы для этой цели. Как мне поступить в таком случае? Должен ли я полностью специализироваться на трех случаях? Разве это не означает, что я должен переписать куски кода?
У меня также есть аналогичный класс Matrix ( Matrix ), и я уверен, что мне понадобятся некоторые конструкторы для вращения, перевода, масштабирования и т. д. Я предполагаю, что мне нужно будет решить аналогичную проблему.
Если вы видите в коде что-то, что кажется вам неправильным, не стесняйтесь указать на это.
РЕДАКТИРОВАТЬ: В случае, если я был недостаточно ясен, массивы должны быть одномерными, и все его компоненты имеют один и тот же тип. Специализации предназначены для массивов с 2, 3 и 4 элементами.
Vector
не нужен определяемый пользователем конструктор копирования или оператор присваивания. - person PaulMcKenzie   schedule 24.11.2015For vectors of length 2, 3, 4
Вы имеете в виду, что количество размеров может быть 2, 3 или 4? - person PaulMcKenzie   schedule 24.11.2015std::vector
(не то же самое, чтоVector
) значений, гдеvector::size()
определяет, есть ли у вас 2, 3, 4 илиn
элементов? - person PaulMcKenzie   schedule 24.11.2015