Thread overview
opIndex for type list
Aug 24, 2020
data pulverizer
Aug 24, 2020
data pulverizer
Aug 24, 2020
Adam D. Ruppe
Aug 24, 2020
data pulverizer
Aug 24, 2020
James Lu
August 24, 2020
Hi all,

I am trying to implement `opIndex` (e.g. T[i]) for types in a struct. So for I have `length`:

```d
struct TList(T...)
{
  enum long length = T.length;
}
```

and have tried including

```d
alias opIndex(long i) = T[i];
```

or

```d
alias opIndex(alias i) = T[i];
```

called with

```d
alias tList = AliasSeq!(bool, string, ubyte, short, ushort);
TList!(tList)[0];
```

but that doesn't work and I get the error:

```d
opIndex cannot deduce function from argument types !()(int), candidates are:
opIndex(long i)

```


August 24, 2020
On Monday, 24 August 2020 at 14:19:14 UTC, data pulverizer wrote:
> I am trying to implement `opIndex` (e.g. T[i]) for types in a struct.

p.s. I know I could just write a separate `get` template, but `AliasSeq` has opIndex and opSlice operators, so I wonder whether it is possible to get those in this case.

August 24, 2020
On Monday, 24 August 2020 at 14:19:14 UTC, data pulverizer wrote:
> I am trying to implement `opIndex` (e.g. T[i]) for types in a struct. So for I have `length`:

Can't really do that, the operator overloads work on instances instead of static types.

AliasSeq is magical because it just gives a name to something built-into the compiler.
August 24, 2020
On Monday, 24 August 2020 at 14:36:22 UTC, Adam D. Ruppe wrote:
> On Monday, 24 August 2020 at 14:19:14 UTC, data pulverizer wrote:
>> I am trying to implement `opIndex` (e.g. T[i]) for types in a struct. So for I have `length`:
>
> Can't really do that, the operator overloads work on instances instead of static types.
>
> AliasSeq is magical because it just gives a name to something built-into the compiler.

Fair enough, it's not a show stopper.
August 24, 2020
On Monday, 24 August 2020 at 14:19:14 UTC, data pulverizer wrote:
> Hi all,
>
> I am trying to implement `opIndex` (e.g. T[i]) for types in a struct. So for I have `length`:
>
> ```d
> struct TList(T...)
> {
>   enum long length = T.length;
> }
> ```
>
> and have tried including
>
> ```d
> alias opIndex(long i) = T[i];
> ```
>
> or
>
> ```d
> alias opIndex(alias i) = T[i];
> ```
>
> called with
>
> ```d
> alias tList = AliasSeq!(bool, string, ubyte, short, ushort);
> TList!(tList)[0];
> ```
>
> but that doesn't work and I get the error:
>
> ```d
> opIndex cannot deduce function from argument types !()(int), candidates are:
> opIndex(long i)
>
> ```

This is an interesting syntax, and it reminds me of Python's generic syntax. Will be interested to see how you use type opIndex.