есть 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 звал конкретную реализацию, которая либо будет найдена (если хедер нужный заинклудили), либо вызовет ошибку компиляции
Обсуждают сегодня