我一直在做很多矢量数学的工作,并为其编写了自己的模板。
我的要求是大量的向量数学(加法、减法、缩放、叉乘和点积),而且我需要能够将我的向量作为 float[] 传递,以便 openGL 可以使用它。
我已经很高兴地使用这个有一段时间了,今天一位讲师看到它并抱怨了。他特别讨厌两件事(其中之一我理解),我对继承的使用,因为它似乎不遵循is a
风格。还有我的选角(T*)this
当然,他也没有太多的办法。
First:继承,我需要能够利用 vec2 到 vec4,所以我这样设计了我的向量。
template<typename T>
Vector2D
{
public:
getX(), getY(), setX(), setY() ....
};
template<typename T>
Vector3D : public Vector2D<T>
{
public:
getZ(), setZ() ...
}
template<typename T>
Vector4D : public Vector3D<T>
{
public:
getW(), setW() ...
}
为什么这样不好?老实说,我不知道如何改进它。我需要(想要)能够定义类型并具有某种类型的 getter 和 setter。如果我重新排列它就像
template<typename T, int _size>
VectorT
我会失去我的.getX()
, .setX()
的东西,并且必须用类似的东西替换它.at()
or []
。老实说,我更喜欢可读性.getX()
,尽管它会使运算符定义更容易。
Second:我明白为什么这很糟糕,但是为了做到这一点,我可以将这些向量传递到需要浮点数组的 openGL 方法中,我已经重载了 splat 运算符
// Defined in Vector2D<T>
operator*() { return (T*)this; }
据我了解,不能保证编译器会将成员变量 x、y、z、w 放在类的开头,如果不小心,我可能最终会传递 v 表。但我必须承认到目前为止我还没有遇到任何问题。
我能看到的唯一方法是维护一个返回的数组。我认为如果我首先改变处理向量的方式会更容易。