how to access struct member using [] operator?

Basile B. via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Sun Sep 25 09:39:38 PDT 2016


On Sunday, 25 September 2016 at 16:26:11 UTC, Basile B. wrote:
> On Sunday, 25 September 2016 at 16:07:59 UTC, Basile B. wrote:
>> On Sunday, 25 September 2016 at 09:01:44 UTC, Namespace wrote:
>>> On Sunday, 25 September 2016 at 04:54:31 UTC, grampus wrote:
>>>> Dear all
>>>>
>>>> For example, I have a struct
>>>> struct point{int x;int y}
>>>> point a;
>>>>
>>>> Is there an easy way to access x and y by using a["x"] and 
>>>> a["y"]
>>>>
>>>> I guess I need to overload [], but can't figure out how.
>>>>
>>>> Someone can help? Thank you very much
>>>
>>> ----
>>> import std.stdio;
>>>
>>> struct Something
>>> {
>>>     int x, y;
>>>     float z;
>>>
>>>     auto opIndex()(string member) {
>>> 		switch (member) {
>>> 			case "x": return this.x;
>>> 			case "y": return this.y;
>>> 			case "z": return this.z;
>>> 			default: assert(0);
>>> 		}
>>>     }
>>> }
>>>
>>> void main(string[] args)
>>> {
>>>     Something s;
>>>     writeln(s["x"]);
>>>     writeln(s["z"]);
>>> }
>>> ----
>>
>> WooW I have to say that I'm mesmerized !
>>
>> How can this works ? "member" is run time variable so the 
>> return type shouldn't be inferable.
>
> Ther's no trick related to compile time:
>
> import std.stdio;
>
>  struct Something
>  {
>      int y;
>      float z;
>      double e;
>      float x = 1234;
>
>      auto opIndex()(const(char)[] member) {
>  		switch (member) {
>  			case "x": return this.x;
>  			case "y": return this.y;
>  			case "z": return this.z;
>             case "e": return this.e;
>  			default: assert(0);
>  		}
>      }
>  }
>
>  void main(string[] args)
>  {
>      Something s;
>      char[] member = "w".dup;
>      member[0]  += args.length;
>      writeln(s[member]);
>  }
>
> Can we get an explanation from a compiler guy ? It seems the 
> the switch statement is already evaluated at compiled time...

"return" in "case" can infer...TIL. That's still a bit strange 
from the ABI point of view...because it means that under win32 it 
knows that z and x have to be returned in ST0, y in EAX...but 
cases are known at compile time...ok I think I get it :]. 
Depending on a static case, another CPU register is filled...


More information about the Digitalmars-d-learn mailing list