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