www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - opIndex for type list

reply data pulverizer <data.pulverizer gmail.com> writes:
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)

```
Aug 24 2020
next sibling parent data pulverizer <data.pulverizer gmail.com> writes:
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.
Aug 24 2020
prev sibling next sibling parent reply Adam D. Ruppe <destructionator gmail.com> writes:
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.
Aug 24 2020
parent data pulverizer <data.pulverizer gmail.com> writes:
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.
Aug 24 2020
prev sibling parent James Lu <jamtlu gmail.com> writes:
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.
Aug 24 2020