LINUX.ORG.RU

Еще вопрос по C++ (templates)


0

0

Можно ли сделать такую весчь:

Например у меня есть общий класс вектора (математического):
template <typename T, uint SIZE> class Vector;
В нем описана куча всяких методов типа dotProduct(), magnitude()
и тд. Но вот в векторе с тремя элементами мне надо считать
crossProduct(). Можно ли сделать так, что при инстанцировании
(это так называется? :-) этого вектора с размером 3, в нем
появлялся бы еще один метод crossProduct() или добавить
еще конструкторы в 2, 3 и 4 векторы.
Ну например вот так:
template <typename T> Vector<T, 3>::crossProduct(const Vector<T, 3> &pVector){/*...*/};
template <typename T> Vector<T, 2>::Vector<T, 2>(T pX, T pY)
{/*...*/};
template <typename T> Vector<T, 3>::Vector<T, 3>(T pX, T pY, T pZ)
{/*...*/};

Или придется создавать новые классы, унаследованные от Vector,
и в них определять эти методы?
anonymous

может еще хочешь чтоб и перегрузка операций автоматом делалась ? -) причем для всех типов векторов

имхо шаблоны для векторов не рационально, т.к. больше чем vec4

наврятли когда придется использовать

anonymous
()
Ответ на: комментарий от anonymous

Т.е. никак?

Просто как сейчас у меня это реализовано:
кадый вектор Vector2, Vector3, Vector4
это отдельные классы, но чего то
много дублирующегося кода,
например сравнения векторов, dotProduct ...

> имхо шаблоны для векторов не рационально, т.к. больше чем vec4
> наврятли когда придется использовать

Еще можно использовать Vector5 { x, y, z, s, t }
(from doom3 SDK).

anonymous
()
Ответ на: комментарий от anonymous

нафига для вектора отдельный класс заводить не понимаю. почему бы не использовать double * и написать кучу всяких функций типа norm1(double *, int n), norm2(double *, int n), scalar(...) ну и тд и тп.

Reset ★★★★★
()

vector3d cross_product(vector3d lhs, vector3d rhs);

можно сделать ее френдом, чтобы реализовать попроще.

AnToXa
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.