У меня есть пара чистых виртуальных классов, Matrix
и Vector
.Во всей моей кодовой базе я стараюсь создавать только зависимости от них, а не их конкретные подклассы, например SimpleTransformationMatrix44
и SimpleTranslationVector4
.Мотивация для этого заключается в том, что я могу использовать сторонние (адаптированные) классы вместо моих без особых проблем.
Я бы хотел перегрузить арифметические операторы (полученные из здесь ):
T T::operator +(const T& b) const;
T T::operator -(const T& b) const;
T T::operator *(const T& b) const;
Я хочу объявить их в чисто виртуальных классах, чтобы можно было выполнять операции над ссылками / указателями на них, проблема в том, что абстрактный класс не может быть возвращен по значению.Лучшее решение, которое я могу придумать, это что-то вроде этого:
std::unique_ptr<T> T::operator +(const T& b) const;
std::unique_ptr<T> T::operator -(const T& b) const;
std::unique_ptr<T> T::operator *(const T& b) const;
, которое позволяет это (без бросков вниз!):
std::unique_ptr<Matrix> exampleFunction(const Matrix& matrix1, const Matrix& matrix2)
{
std::unique_ptr<Matrix> product = matrix1 * matrix2;
return std::move(product);
}
Кажется, что указатель является единственным вариантом в этомслучай, поскольку возвращение значения недопустимо, а возвращение ссылки просто глупо.
Итак, я предполагаю, что мой вопрос таков: ушел ли я из сюжета с этой идеей?Если бы вы увидели это в каком-то коде, над которым вы работали, вы бы подумали о WTF?Есть ли лучший способ добиться этого?