考虑一个类:
template<typename Type>
class CVector2
{
public:
union {
struct { Type x; Type y; };
Type v[2];
};
// A bunch of methods for vector manipulation follow
}
它可以这样使用:
CVector2<int> vec;
vec.x = 1;
vec.y = rand();
// ...
vec.v[rand() & 1] = vec.x;
问题是,这个联合不是标准的 C++,因为没有命名结构。我只能看到一种使其成为标准的方法 - 命名结构:
union {
struct { Type x; Type y; } xy;
Type v[2];
};
然后我要么必须使任何矢量场访问时间更长:
CVector2<int> vec;
vec.xy.x = 1;
vec.xy.y = rand();
// ...
vec.v[rand() & 1] = vec.xy.x;
或者我必须声明方便的方法,这会有所帮助,但在复杂的用例中,由于额外的大括号,访问仍然会变得很麻烦:
class CVector2
{
public:
union {
struct { Type x; Type y; };
Type v[2];
};
Type& x() {return xy.x;}
const Type& x() const {return xy.x;}
Type& y() {return xy.y;}
const Type& y() const {return xy.y;}
}
使用示例:
void setGeometry (CVector2<int> p1, CVector2<int> p2)
{
setGeometry(CRect(CPoint(p1.x(), p1.y()), CPoint(p2.x(), p2.y())));
}
有没有更好的方法可以使 CVector2 类与我缺少的 -pedantic-errors 一起编译?