Я пытаюсь создать классы для математических векторов в разных измерениях, и поскольку они имеют много общего, я создал шаблонный базовый класс с размером векторов в качестве параметра шаблона. Я подклассифицирован, потому что мне нужны разные конструкторы (например, Vec2f(float x, float y)
, Vec3f(float x, float y, float z)
) и дополнительные функции, такие как кросс-продукт для трехмерных векторов.Подкласс класса шаблона с операторами
Моя проблема: что должно operator+
в возврате базового элемента? Если он возвращает экземпляр базового слоя, то Vec3f + Vec3f
возвращает Vecnf
, но он должен вернуть Vec3f
. Может ли это быть достигнуто каким-то образом?
Вот пример кода:
template <size_t n>
class Vecnf {
public:
Vecnf operator+(Vecnf const & vec) const {
return Vecnf(*this) += vec;
}
Vecnf & operator+=(Vecnf const & vec) {
for (int i = 0; i < n; ++i) {
elements[i] += vec.elements[i];
}
return *this;
}
protected:
std::array<float, n> elements;
};
class Vec3f : public Vecnf<3> {
public:
Vec3f(float x = 0.0f, float y = 0.0f, float z = 0.0f);
Vec3f crossProd(Vec3f const & vec);
};
С этой реализации, следующее:
Vec3f a, b;
Vec3f c = a + b;
дает ошибку во время компиляции
error: conversion from 'Vecnf<3u>' to non-scalar type 'Vec3f' requested
Я использую TDM GCC версии 4.8.1 на Windows 8 Pro. Я использую C++ 11, поэтому ваше решение также может использовать его, но, поскольку я не думаю, что это важно, я не задал вопрос с ним. Заранее спасибо :)
CRTP поможет вам здесь. Я не уверен, что это было бы приятно. –
Может быть [этот ответ] (http://stackoverflow.com/a/15666231) помогает? –
'Vec3f' может иметь конструктор, который принимает' Vecnf <3> && '... – Jarod42