Доступ к защищенным членам за пределами класса / структуры? - PullRequest
0 голосов
/ 15 ноября 2018

У меня есть куча шаблонных структур (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);

1 Ответ

0 голосов
/ 15 ноября 2018

Есть ли способ "сделать функцию друзей структурой"?

Да, вы можете объявить специализацию шаблона функции как friend.например,

// forward declaration
template<typename T>
class Vec4;
template<typename T>
class Mat4;

// declaration
template<typename T>
Vec4<T> operator*(const Vec4<T>&, const Mat4<T>&);

template<typename T>
class Vec4 {  
    // friend declaration  
    friend Vec4<T> operator* <T> (const Vec4<T>&, const Mat4<T>&);
    ...
};

template<typename T>
class Mat4 {    
    // friend declaration  
    friend Vec4<T> operator* <T> (const Vec4<T>&, const Mat4<T>&);
    ...
};

// definition  
template<typename T>
Vec4<T> operator*(const Vec4<T>&, const Mat4<T>&)
{
    ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...