工会中的通用结构

时间:2010-10-05 20:21:01

标签: c++ templates

我正在尝试制作一个通用的矢量类。虽然我可以这样做:

struct vector3 {
  union {
    struct {
      float x;
      float y;
      float z;
    };
    float v[3];
  };
};

我不能这样做:

template<int N, typename S, typename T = double>
class vec {
    union {
        T data[N];
        S;
    };
};

struct XY { REAL x, y; };
typedef vec<2, XY, REAL> Vector2;

因为“S没有声明任何内容。”

有没有办法将通用模板参数作为联合的成员插入?基本上,我想将 x y 字段“注入”vec类。有没有更好的方法呢?

2 个答案:

答案 0 :(得分:6)

您需要为该成员命名:

template<int N, typename S, typename T = double>
class vec {
    union {
        T data[N];
        S you_need_to_have_a_member_name_here;
    };
};

struct XY { REAL x, y; };
typedef vec<2, XY, REAL> Vector2;

但更重要的是,你究竟想要完成什么?如果你想要一个异构容器,你应该通过多态来实现。如果您想要通用矢量,请使用std::vector

此外,您不能使用模板来提供成员名称,只能使用成员类型。上述内容仍然可以Vector2::you_need_to_have_a_member_name_here.xVector2::you_need_to_have_a_member_name_here.y访问。

<强> EDIT1

好的,你正在做的事情并不是那么简单。但是有一种简单的方法(虽然这是纯粹的邪恶)。

#define Vec(D, X) struct Vector ## D { \
  X;  \
};

Vec(2, int x, y)
Vec(3, int x, y, z)
Vec(4, int w, x, y, z)
Vec(5, int v, w, x, y, z)

它不漂亮,安全或理智,但它会起作用。仅当您确实需要特定的成员名称时才会这样。一般来说,如果你能放弃这个要求,就会有更安全的方法。

答案 1 :(得分:1)

我认为你需要实现元组?这就是我从泛型向量中理解的(我假设这是向量空间的向量,而不是std::vector)。 C++0x has this feature。不确定哪个编译器实现它。