Struct fields and properties as alias members

Adam D Ruppe destructionator at gmail.com
Wed Dec 8 17:44:47 UTC 2021


On Wednesday, 8 December 2021 at 17:19:32 UTC, Ben Jones wrote:
> It seems like maybe I'd have to pass s as a runtime parameter 
> to get it to work?

yes, you do. the alias param passes the abstract idea of the 
variable instead of the variable:

> void main(){
>     S s;
>     func!(s.a)();

See, you said `s` here, but the compiler ACTUALLY passes `S.a` - 
the type reference instead of the instance reference.

That's why it complains about missing `this` - the compiler 
dropped it. The `this` is a runtime reference, and the alias 
works on compile time references.

You can pass a runtime reference in addition to the alias and put 
them back together with __traits(child), but be warned, the 
compiler also can get pretty stupid when pass so you need to make 
`func` static since when it sees the alias it assumes it must be 
a member. Weird but easy fix:

```
import std.stdio;

struct S{
     int a = 1;
     int b = 2;

     @property int c(){ return a; }
     @property int c(int newc) { a = newc; return a;}
}	

// made static, added a ref S to act as `this`
static void func(alias field)(ref S s){
      // now the traits child re-attaches `s` as the this
      // reference to the alias
  	writeln(__traits(child, s, field));
     __traits(child, s, field) = 5;
}
void main(){
     S s;
     func!(s.a)(s); // passing both ct alias and runtime this
     func!(s.b)(s);

     func!(s.c)(s);
}
```


More information about the Digitalmars-d-learn mailing list