访问 class/struct 范围外的受保护成员?
Access protected members outside class/struct scope?
我有一堆模板化结构(Vec3<T>
、Vec4<T>
、Mat4<T>
、...)并且我正在做大量的运算符重载。我已将 Mat4<T> * Vec4<T>
定义为通常的 matrix-vector 乘法。现在我想将 Vec4<T> * Mat4<T>
定义为 row-by-row 乘法。
我还保护了底层数据结构(我正在使用 SIMD 向量)和结构朋友,以便访问受保护的 data
字段。
问题是我想在Mat4<T>
header 文件中定义operator*(const Vec4<T>&, const Mat4<T>&)
。通常我定义交换运算符的做法是:
template<typename T>
Vec3<T> operator*(const T & s, const Vec3<T> & v)
{
return v * s;
}
但在这种情况下我必须改变行为,我无法访问 Mat4<T>
和 Vec4<T>
的受保护成员。
- 有办法"make the function friend of the structs"吗?
- 或者,如果
Mat4<T>
是一个不完整的类型,我能否将 operator*(const Mat4<T>&)
声明为 Vec4<T>
成员(然后在 Mat4<T>
header 中定义它)在结构定义之后)?
注意:我想避免像 const typename Mat4<T>::MT & getData() const;
这样的 public getter 检索 data
的不可变引用
解决方案
@songyuanyao 的回答对我来说差不多:
// In both Mat4 and Vec4
template<typename F>
friend Mat4<F> operator*(const Vec4<F> & v, const Mat4<F> & m);
Is there a way to "make the function friend of the structs"?
是的,您可以将函数模板的特化声明为 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>&)
{
...
}
我有一堆模板化结构(Vec3<T>
、Vec4<T>
、Mat4<T>
、...)并且我正在做大量的运算符重载。我已将 Mat4<T> * Vec4<T>
定义为通常的 matrix-vector 乘法。现在我想将 Vec4<T> * Mat4<T>
定义为 row-by-row 乘法。
我还保护了底层数据结构(我正在使用 SIMD 向量)和结构朋友,以便访问受保护的 data
字段。
问题是我想在Mat4<T>
header 文件中定义operator*(const Vec4<T>&, const Mat4<T>&)
。通常我定义交换运算符的做法是:
template<typename T>
Vec3<T> operator*(const T & s, const Vec3<T> & v)
{
return v * s;
}
但在这种情况下我必须改变行为,我无法访问 Mat4<T>
和 Vec4<T>
的受保护成员。
- 有办法"make the function friend of the structs"吗?
- 或者,如果
Mat4<T>
是一个不完整的类型,我能否将operator*(const Mat4<T>&)
声明为Vec4<T>
成员(然后在Mat4<T>
header 中定义它)在结构定义之后)?
注意:我想避免像 const typename Mat4<T>::MT & getData() const;
这样的 public getter 检索 data
解决方案
@songyuanyao 的回答对我来说差不多:
// In both Mat4 and Vec4
template<typename F>
friend Mat4<F> operator*(const Vec4<F> & v, const Mat4<F> & m);
Is there a way to "make the function friend of the structs"?
是的,您可以将函数模板的特化声明为 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>&)
{
...
}