how to access struct member using [] operator?

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


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...


More information about the Digitalmars-d-learn mailing list