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