How can i increase max number recursive template expansions?

Simen Kjaeraas simen.kjaras at gmail.com
Sun Jul 7 13:22:38 PDT 2013


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.

-- 
Simen


More information about the Digitalmars-d-learn mailing list