我正在尝试制作一个通用的矢量类。虽然我可以这样做:
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类。有没有更好的方法呢?
答案 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.x
和Vector2::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。不确定哪个编译器实现它。