On 1/12/22 3:59 AM, JG wrote:
> Hi,
I want to make a type which has two fields x and y but can
also be indexed with [0] and [1] checked at compile time.
Is the following reasonable / correct?
struct Point
{
double x;
double y;
alias expand = typeof(this).tupleof;
alias expand this;
}
unittest
{
Point p = Point(1.2,3.4);
assert(p[0]==1.2);
assert(p[1]==3.4);
assert(!__traits(compiles,Point.init[3]));
}
I was going to reply that you can't do it this way, but it works. Very interesting!
I would say to go with that, and I love that technique! Seems like it started allowing alias to tupleof
in 2.094.
std.typecons.Tuple
does it much differently. It declares the tuple as an alias-this'd member, and then defines named accessors for each of the items (if you give them names).
One thing I did find is that foreach doesn't like your mechanism, whereas the Tuple mechanism does work:
foreach(x, y; only(Point(1.0, 2.0)) {} // error
foreach(x, y; only(tuple(1.0, 2.0)) {} // ok
-Steve