В C ++ я пытаюсь создать специализированный точечный класс как объединение, например так:
union point
{
struct { float x, y, z; };
float val[3];
float operator[](unsigned i) { return val[i]; }
};
Чтобы я мог получить доступ к точке в виде массива или нескольких точек для удобства чтения.
Однако, скажем, я хочу обобщить это немного:
template<unsigned n>
union point
{
struct { float ???; };
float val[n];
float operator[](unsigned i) { return val[i]; }
};
Что я могу поставить на ???
? Я мог бы иметь x
, x, y
, x, y, z
или x, y, z, w
в зависимости от того, что такое n
. Решение? Форвард декларации!
template<unsigned n>
union point
{
struct coords;
float val[n];
float operator[](unsigned i) { return val[i]; }
};
template<>
struct point::coords<3>
{
float x, y, z;
};
// ...
Но, похоже, это не работает. В соответствии с GCC 4.6 он компилируется, однако, всякий раз, когда я пытаюсь использовать члены, например так:
point<3> val;
val.x;
Я получаю ошибку:
error: ‘union point<3>’ has no member named ‘x’
Даже если я изменю val.x
на val.coords::x
, я все равно получаю ошибку:
error: ‘union point<3>::coords’ is not a base of ‘union point<3>’
Добавление using coords;
в определении объединения тоже не помогло.
Есть ли способ сделать это в GCC 4.6? Есть ли другой способ сделать это? Это вообще возможно?