在类/结构范围之外访问受保护的成员?

时间:2018-11-15 10:37:27

标签: c++ templates struct operator-overloading protected

我有一堆模板化结构(Vec3<T>Vec4<T>Mat4<T>等),并且我在做很多操作符重载。我已经将Mat4<T> * Vec4<T>定义为通常的矩阵向量乘法。现在,我想将Vec4<T> * Mat4<T>定义为逐行乘法。

我还使基础数据结构(我正在使用SIMD向量)受到保护,并且使结构的朋友能够访问受保护的data字段。

问题是我想在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 :(得分:3)

  

有没有办法让函数成为结构的朋友?

是的,您可以将功能模板的特殊化声明为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>&)
{
    ...
}