我一直在做很多矢量数学的东西,并为它编写了我自己的模板.
我的要求是很多矢量数学(加法,减法,缩放,交叉刺和点刺)我还需要能够将我的向量作为float []传递,以便openGL可以使用它.
我一直很愉快地使用这个,今天一位讲师看到它并呻吟.有两件事他特别讨厌(其中一件我理解),我对继承的使用,因为它似乎没有遵循一种is a风格.而我的演员(T*)this,当然他没有太多的解决方案.
第一: 继承,我需要能够使用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() ...
}
Run Code Online (Sandbox Code Playgroud)
为什么这么糟糕?和tbh我看不出如何改进它.我需要(想要)能够定义类型并具有某种类型的getter和setter.如果我重新排列它就像
template<typename T, int _size>
VectorT
Run Code Online (Sandbox Code Playgroud)
我会失去我.getX(),.setX()东西,有喜欢的东西来取代它.at()或[].tbh我更喜欢它的可读性.getX(),尽管它会使操作符定义更容易.
第二: 我可以看出为什么这很糟糕,但为了实现这一点我可以将这些向量传递给openGL的方法,该方法期望浮点数组我重载了splat运算符
// Defined in Vector2D<T>
operator*() { return (T*)this; }
Run Code Online (Sandbox Code Playgroud)
据我所知,不能保证编译器会将成员变量x,y,z,w放在类的开头,如果不小心,我可能最终会传递v-table.但是我必须承认到目前为止我没有遇到任何问题.
我能看到的唯一方法是维护一个返回的数组.如果我改变他们的方式,我认为这将更容易,我首先处理矢量.