opDispatch with string mixin does not work as I would expect.

Nicholas Wilson iamthewilsonator at hotmail.com
Sat Feb 10 07:47:58 UTC 2018


On Saturday, 10 February 2018 at 06:32:43 UTC, German Diago wrote:
> Hello everyone,
>
> I am trying to forward some member functions from a struct as a 
> Catch-all function, so I did something like this:
>
>     struct A {
>         struct HeaderData {
>           align(1):
>           char [21] id;
>           ubyte field1;
>           ubyte field2;
>         }
>
>         Nullable!(HeaderData) headerData;
>
>
>         auto opDispatch(string name)() {
>           readHeader();
>           static foreach (member; __traits(allMembers, 
> HeaderData)) {
>              static if (name == member) {
>                  return mixin("headerData." ~ name);
>              }
>           }
>       }
>
> The mixin line does not work. I want to generate the access to 
> the field. How could I achieve that?

That looks like it should work. Perhaps you need to change
`static if (name == member)` to
`static if (name == member.stringof)`

Alternatively you could do something like

>     auto opDispatch(string name)() 
> if(hasMember!(HeaderData,name){
>           readHeader();
>           return mixin("headerData." ~ name);
>     }



More information about the Digitalmars-d-learn mailing list