How can i increase max number recursive template expansions?
John Colvin
john.loughran.colvin at gmail.com
Sun Jul 7 13:28:11 PDT 2013
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!
More information about the Digitalmars-d-learn
mailing list