есть 4 класса matrix и vector2, vector3, vector4, необходимо создать оператор который будет работать с двумя классами, но так, чтобы при подключении одного из них не подтягивался другой.
Сделал хедер который подключаю в конец обоих файлов:
#if defined(_MATRIX_HPP) /* макросы по типу _NAME_HPP, это символ который дефайнится если соответствующий хедер подключён */
# if defined(_VECTOR_2_HPP)
Vector2 operator*(const Matrix &l, const Vector2 &r) { ... }
# endif
# if defined(_VECTOR_3_HPP)
Vector3 operator*(const Matrix &l, const Vector3 &r) { ... }
# endif
# if defined(_VECTOR_4_HPP)
Vector4 operator*(const Matrix &l, const Vector4 &r) { ... }
# endif
#endif
Реализация как по мне крайне неадекватная(или нет?). Как это делают нормальные люди?
а операторы так сильно отличаются друг от друга? и как может помешать наличие сразу 4-х или 10-ти операторов?
Хз но зависимоть от порядка хедеров такое себе
Ф О Р В А Р Д Д Е К Л А Р А Ц И И О Р В А Р Д Д Е К Л А Р А Ц И И
Мне кажется у тебя с такой темой может ODR полететь
я бы сделал template <class Matrix, class Vector> Vector operator*(const Matrix& m, const Vector& v) обмазал requires/SFINAE а внутри по if constexpr звал конкретную реализацию, которая либо будет найдена (если хедер нужный заинклудили), либо вызовет ошибку компиляции
Обсуждают сегодня