|
Boost : |
From: Dave Harris (brangdon_at_[hidden])
Date: 2006-09-21 15:15:26
In-Reply-To: <20060921173331.GJ14139_at_[hidden]>
irving_at_[hidden] (Geoffrey Irving) wrote (abridged):
> I don't think there's any reason to overthink this. The simple scheme
> works:
>
> template<class T> class vector3
> {
> public:
> T x,y,z;
>
> vector3()
> {
> assert(&z == &x+3);
> }
>
> T& operator[](unsigned i)
> {assert(i<3);return (&x)[i];}
> };
>
> It can probably even be considered standard compliant: if the assert
> doesn't hit, I'm pretty sure the standard guarantees that the code
> is correct.
You probably meant "&x+2" in the first assert. I agree if that assert
passes the code probably works, but I don't think the assert is guaranteed
to pass. Personally I don't think code like that belongs in Boost; Boost
ought to be exemplary.
I'd prefer:
template<class T> class vector3 {
T base[3];
public:
T& operator[](unsigned i) {
assert(i<3);
return base[i];
}
T& x() { return base[0]; }
T& y() { return base[1]; }
T& z() { return base[2]; }
};
with no public variables. The encapsulation is worth the extra brackets.
(Actually I'd rather use v.set_x(3) than v.x() = 3.)
-- Dave Harris, Nottingham, UK.
Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk