On Sunday, 7 July 2013 at 20:22:59 UTC, Simen Kjaeraas wrote:
On 2013-07-07, 21:55, QAston wrote:

I have a large enum in my code (opcodes for a protocol) - using std.traits.EnumMembers gives me a recursive template error.

How can i increase max number recursive template expansions?

You can't. However, you can amend std.traits.EnumMembers to work
with larger enums by using this version:



import std.typetuple;

template EnumMembers(E)
    if (is(E == enum))
{
    // Supply the specified identifier to an constant value.
    template WithIdentifier(string ident)
    {
        static if (ident == "Symbolize")
        {
            template Symbolize(alias value)
            {
                enum Symbolize = value;
            }
        }
        else
        {
            mixin("template Symbolize(alias "~ ident ~")"
                 ~"{"
                     ~"alias "~ ident ~" Symbolize;"
                 ~"}");
        }
    }

    template EnumSpecificMembers(names...)
    {
        static if (names.length > 200)
        {
            alias TypeTuple!(
                    EnumSpecificMembers!(names[0..$/2]),
                    EnumSpecificMembers!(names[$/2..$]),
                ) EnumSpecificMembers;
        }
        else static if (names.length > 0)
        {
            alias TypeTuple!(
                    WithIdentifier!(names[0])
.Symbolize!(__traits(getMember, E, names[0])),
                    EnumSpecificMembers!(names[1 .. $]),
                ) EnumSpecificMembers;
        }
        else
        {
            alias TypeTuple!() EnumSpecificMembers;
        }
    }

alias EnumSpecificMembers!(__traits(allMembers, E)) EnumMembers;
}



Here, this line:
        static if (names.length > 200)
uses divide-and-conquer to reduce the number of template instantiations.

We came up with almost identical solutions, posted within 19 seconds of each other!

Reply via email to