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:

```d
foreach(x, y; only(Point(1.0, 2.0)) {} // error
foreach(x, y; only(tuple(1.0, 2.0)) {} // ok
```

-Steve

Reply via email to