On Sunday, 24 June 2018 at 23:21:44 UTC, Steven Schveighoffer wrote:
     @property string toString() @safe pure nothrow @nogc
     {
         final switch (_enum)
         {
            static foreach (index, member; __traits(allMembers, E))
             {
                 static if (index == 0 ||
                           (__traits(getMember, E, __traits(allMembers, E)[index - 1]) !=
                             __traits(getMember, E, member)))
                 {
                 case __traits(getMember, E, member):
                     return member;
                 }
             }
         }
     }
     E _enum;                    // the wrapped enum
     alias _enum this;
}

Provided that

    __traits(allMembers, E)

is a cheap operation as it's called once for every enumerator. I could get it out of the loop; if I do as

    @property string toString() @safe pure nothrow @nogc
    {
        final switch (_enum)
        {
            enum members = __traits(allMembers, E);
static foreach (index, member; __traits(allMembers, E))
            {
                static if (index == 0 ||
(__traits(getMember, E, members[index - 1]) !=
                            __traits(getMember, E, member)))
                {
                case __traits(getMember, E, member):
                    return member;
                }
            }
        }
    }

the compiler complains as

enum_ex.d(19,29): Error: expression expected as second argument of __traits `getMember`

Is

    __traits(allMembers, ...)

cached by the compiler?

Reply via email to