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

You can't do that. There's a problem because the string passed is not known at compile-time, so the return type of "opIndex(string member)" cannot be inferred.

It works only for one type:

°°°°°°°°°°°°°°°°°°°
import std.stdio;

struct Something
{
    int x,y;
    float z;

    int opIndex(string member)
    {
        alias T = typeof(this);
        foreach(m;__traits(allMembers, T))
        if (m == member)
        {
static if (is(typeof(__traits(getMember, T, m)) == int))
                return __traits(getMember, T, m);
        }
        assert(0);
    }
}

void main(string[] args)
{
    Something s;
    writeln(s["x"]);
}
°°°°°°°°°°°°°°°°°°°

If you add a template parameter to opIndex then you can't call it with the array syntax so it becomes pointless to use an operator overload.

Reply via email to