Thread overview | ||||||
---|---|---|---|---|---|---|
|
February 10, 2018 opDispatch with string mixin does not work as I would expect. | ||||
---|---|---|---|---|
| ||||
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 Re: opDispatch with string mixin does not work as I would expect. | ||||
---|---|---|---|---|
| ||||
Posted in reply to German Diago | 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 Re: opDispatch with string mixin does not work as I would expect. | ||||
---|---|---|---|---|
| ||||
Posted in reply to German Diago | 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 Re: opDispatch with string mixin does not work as I would expect. | ||||
---|---|---|---|---|
| ||||
Posted in reply to Nicholas Wilson | 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. :) |
Copyright © 1999-2021 by the D Language Foundation