title: C++ Vector Math and OpenGL compatible
body: <p>I've been doing lots of vector math stuff and wrote my own template for it.</p>
  
  <p>My requirements are lots of vector maths (addition, subtraction, scale, cross prod, and dot prod) also I need to be able to pass my vector as a float[] so that openGL can make use of it.</p>
  
  <p>I've been using this quite happily for sometime, today a lecturer saw it and groaned. There was two things he particularly hated (one of which I understand), my use of inheritance because it didn't seem to follow an <code>is a</code> style. And my casting <code>(T*)this</code>, of course he didn't have much in the way of a solution.</p>
  
  <p><strong>First:</strong>
  The inheritance, I need to be able to make use of vec2 to vec4's so I designed my vectors like this.</p>
  
  <pre><code>template&lt;typename T&gt;
  Vector2D
  {
   public:
   getX(), getY(), setX(), setY() ....
  };
  
  template&lt;typename T&gt;
  Vector3D : public Vector2D&lt;T&gt;
  {
   public:
   getZ(), setZ() ...
  }
  
  template&lt;typename T&gt;
  Vector4D : public Vector3D&lt;T&gt;
  {
   public:
   getW(), setW() ...
  }
  </code></pre>
  
  <p>Why is this bad? and tbh I can't see how to improve it. I need(want) to be able to define type and have getters and setters of some sort. If I rearranged it like</p>
  
  <pre><code>template&lt;typename T, int _size&gt;
  VectorT
  </code></pre>
  
  <p>I'd loose my <code>.getX()</code>, <code>.setX()</code> stuff and have to replace it with something like <code>.at()</code> or <code>[]</code>. tbh I prefer the readability of <code>.getX()</code>, although it would make operator definitions easier.</p>
  
  <p><strong>Second:</strong>
  I can see why this is bad, but to make it so I can pass these vectors into openGL's method that expect a float array I've overloaded the splat operator</p>
  
  <pre><code>// Defined in Vector2D&lt;T&gt;
  operator*() { return (T*)this; }
  </code></pre>
  
  <p>As I understand it, there is no guarantee that the compiler will put the member variables x,y,z,w at the beginning of the class, and if not careful I might end up passing the v-table instead. However I must admit I've had no problems so far.</p>
  
  <p>The only way I can see around this is to maintain an array that gets returned. Which I suppose would be easier if I changed they way I deal with vectors in the first place.</p>