Как насчет:
class Vector3 : public Vector<3>
{
public:
// initialize the references...
Vector3() : x(data[0]), y(data[1]), z(data[2]){}
private:
float& x;
float& y;
float& z;
};
Конечно, если вы хотите, чтобы они занимали то же пространство , тогда это другая история ...
Снемного магии шаблонов, вы можете сделать следующее ...
#include <iostream>
template <int N, typename UnionType = void*> struct Vector
{
union
{
float data[N];
UnionType field;
};
void set(int i, float f)
{
data[i] = f;
}
// in here, now work with data
void print()
{
for(int i = 0; i < N; ++i)
std::cout << i << ":" << data[i] << std::endl;
}
};
// Define a structure of three floats
struct Float3
{
float x;
float y;
float z;
};
struct Vector3 : public Vector<3, Float3>
{
};
int main(void)
{
Vector<2> v1;
v1.set(0, 0.1);
v1.set(1, 0.2);
v1.print();
Vector3 v2;
v2.field.x = 0.2;
v2.field.y = 0.3;
v2.field.z = 0.4;
v2.print();
}
РЕДАКТИРОВАТЬ: прочитав комментарий, я понимаю, что я публиковал ранее, на самом деле ничем не отличается, так что небольшое изменение предыдущей итерации, чтобы обеспечить прямойдоступ к полю (что, как я полагаю, вам нужно) - я полагаю, что разница между этим решением Роба и приведенным ниже решением состоит в том, что вам не нужны все специализации, чтобы снова и снова реализовывать всю логику ...