Thread overview
opDispatch with string mixin does not work as I would expect.
Feb 10, 2018
German Diago
Feb 10, 2018
Boris-Barboris
Feb 10, 2018
Nicholas Wilson
Feb 10, 2018
German Diago
February 10, 2018
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?
February 10, 2018
On Saturday, 10 February 2018 at 06:32:43 UTC, German Diago wrote:
> The mixin line does not work. I want to generate the access to the field. How could I achieve that?


struct Outer
{
	struct Inner
	{
		int a;
		float b;
	}
	Inner i;
	
	auto opDispatch(string name)()
	{
		return __traits(getMember, i, name);
	}
}

February 10, 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);
>     }

February 10, 2018
On Saturday, 10 February 2018 at 07:47:58 UTC, Nicholas Wilson wrote:
> On Saturday, 10 February 2018 at 06:32:43 UTC, German Diago

> Alternatively you could do something like
>
>>     auto opDispatch(string name)() if(hasMember!(HeaderData,name){
>>           readHeader();
>>           return mixin("headerData." ~ name);
>>     }

Do not ask me why but now seems to work with my initial solution. :)