У меня есть куча шаблонных структур (Vec3<T>
, Vec4<T>
, Mat4<T>
, ...), и я делаю много перегрузок операторов.Я определил Mat4<T> * Vec4<T>
как обычное матрично-векторное умножение.Теперь я хотел определить Vec4<T> * Mat4<T>
как умножение строк на строки.
Я также сделал защищенную базовую структуру данных (я работаю с векторами SIMD) и друзей структуры, чтобы получить доступ к защищенномуdata
field.
Проблема в том, что я хотел бы определить operator*(const Vec4<T>&, const Mat4<T>&)
в заголовочном файле Mat4<T>
.Обычно я определяю коммутативный оператор:
template<typename T>
Vec3<T> operator*(const T & s, const Vec3<T> & v)
{
return v * s;
}
Но в этом случае мне нужно изменить поведение, и я не могу получить доступ к защищенному члену Mat4<T>
и Vec4<T>
.
- Есть ли способ "сделать функцию другом структур"?
- В качестве альтернативы, можно ли объявить
operator*(const Mat4<T>&)
как член Vec4<T>
, если Mat4<T>
является неполным типом(и позже определите его в заголовке Mat4<T>
после определения структуры)?
ПРИМЕЧАНИЕ. Я бы хотел избежать общедоступного метода получения, такого как const typename Mat4<T>::MT & getData() const;
, который извлекает неизменную ссылку data
РЕШЕНИЕ
Ответ @songyuanyao был для меня почти правильным:
// In both Mat4 and Vec4
template<typename F>
friend Mat4<F> operator*(const Vec4<F> & v, const Mat4<F> & m);