Я много занимался векторной математикой и написал для нее свой собственный шаблон.
Мои требования - много векторной математики (сложение, вычитание, масштабирование, перекрестное и точечное производство), также ямне нужно передать мой вектор как число с плавающей точкой [], чтобы openGL мог его использовать.
Некоторое время я пользовался этим довольно счастливо, сегодня лектор увидел это и застонал.Было две вещи, которые он особенно ненавидел (одну из которых я понимаю), мое использование наследования, потому что, похоже, оно не следовало стилю is a
.И мой кастинг (T*)this
, конечно, у него не было особых решений.
Первый: Наследование, мне нужно иметь возможность использовать vec2 дляВ vec4 я разработал свои векторы вот так.
template<typename T>
Vector2D
{
public:
getX(), getY(), setX(), setY() ....
};
template<typename T>
Vector3D : public Vector2D<T>
{
public:
getZ(), setZ() ...
}
template<typename T>
Vector4D : public Vector3D<T>
{
public:
getW(), setW() ...
}
Почему это плохо?и я не вижу, как это улучшить.Мне нужно (хочу) иметь возможность определять тип и иметь какие-то методы получения и установки.Если бы я переставил его, как
template<typename T, int _size>
VectorT
, я бы потерял свои вещи .getX()
, .setX()
и мне пришлось бы заменить их на что-то вроде .at()
или []
.Я предпочитаю удобочитаемость .getX()
, хотя это облегчит определения операторов.
Второе: Я могу понять, почему это плохо, но чтобы сделать так, чтобы я мог передавать эти векторыв метод openGL, который ожидает массив с плавающей точкой, я перегружен оператором сплата
// Defined in Vector2D<T>
operator*() { return (T*)this; }
Насколько я понимаю, нет гарантии, что компилятор поместит переменные-члены x, y, z, w вначало класса, и если не быть осторожным, я мог бы закончить прохождение v-таблицы вместо этого.Однако я должен признать, что у меня до сих пор не было проблем.
Единственный способ, который я могу увидеть в этом, - поддерживать возвращаемый массив.Что, я полагаю, было бы проще, если бы я изменил их так, как я имею дело с векторами.