On Tuesday, 2 June 2020 at 09:28:01 UTC, realhet wrote:

I did it that way:
private enum fieldMap = [ // simple names for descriptive and structured fields
    "hauteur"       : "general.height",
    "rayon"         : "profile.radius",
    "plage"         : "profile.plage",
    "offsetv"       : "profile.verticalOffset",
    "offseth"       : "profile.horizontalOffset",
    "varrad0"       : "profile.linearVariationBottom",
    "varrad1"       : "profile.linearVariationTop",
    "amplitude"     : "periphery.amplitude",
    "varlin0"       : "periphery.linearVariationBottom",
    "varlin1"       : "periphery.linearVariationTop",
    "varsinp"       : "periphery.cosinusVariationPlage",
    "varsino"       : "periphery.cosinusVariationOffset",
    "periodes"      : "periphery.nbPeriods",
    "revolution"    : "periphery.turn"
  ];

static foreach(k, v; fieldMap){ mixin("@property auto $() const{ return #; }".replace("$", k).replace("#", v)); } //I know, i know -> AliasSeq :D

But it doesn't look nice.

Try UDAs instead of a map:

struct A {
    struct G {
        @("hauteur") int height;
    }
    struct P {
        @("rayon")   int radius;
        @("plage")   int plage;
        @("offsetv") int verticalOffset;
        @("offseth") int horizontalOffset;

        int noShortcut;

        @("varrad0") int linearVariationBottom;
    }

    G general;
    P profile;
    /* ... */
    static foreach (i, m; typeof(this).tupleof)
        static foreach (j, f; typeof(m).tupleof)
            static if (__traits(getAttributes, f).length)
mixin("@property auto ", __traits(getAttributes, f)[0], "() const { return this.tupleof[i].tupleof[j]; }");
}

pragma(msg, __traits(allMembers, A));

Reply via email to