I would like to do a compile-time mapping of an array accessor to a list of scalars as in the following class:
Hi Steven, This is something I found floating on the net some time ago, perhaps it will give you some ideas: template <typename T> class Vector4 { typedef T Vector4<T>::* const vec[4]; static const vec v; public: T x, y, z, w; Vector4() : x(0), y(0), z(0), w(0) { } Vector4(T _x, T _y, T _z, T _w) : x(_x), y(_y), z(_z), w(_w) { } const T& operator[](size_t i) const { return this->*v[i]; } T& operator[](size_t i) { return this->*v[i]; } }; template <typename T> const typename Vector4<T>::vec Vector4<T>::v = { &Vector4<T>::x, &Vector4<T>::y, &Vector4<T>::z, &Vector4<T>::w }; template <typename T> class Matrix4 { typedef Vector4<T> Matrix4::* const mat[4]; static const mat a; public: Vector4<T> i, j, k, l; Matrix4() : i(), j(), k(), l() { } Matrix4(const Vector4<T>& _i, const Vector4<T>& _j, const Vector4<T>& _k, const Vector4<T>& _l) : i(_i), j(_j), k(_k), l(_l) { } const Vector4<T>& operator[](size_t i) const { return this->*a[i]; } Vector4<T>& operator[](size_t i) { return this->*a[i]; } }; template <typename T> const typename Matrix4<T>::mat Matrix4<T>::a = { &Matrix4<T>::i, &Matrix4<T>::j, &Matrix4<T>::k, &Matrix4<T>::l }; Cheers, Anders Dalvander