Merhaba,
Bakınız adamlar neler yapmışlar! Herhangi bir döngü yok ve bildirilen enum'un tüm üyelerini çokuzlu olarak geri döndürüyor. Bunu nasıl yaptığını tam olarak anlayamasam da özyinelemeli olarak şablonu çağırdığını ve dilim kullanarak tek tek enum üzerinde gezdiğini zannediyorum.
Alıntı:
>> template EnumSpecificMembers(names...) {
> static if (names.length > 0) {
> alias TypeTuple!(
> WithIdentifier!(names[0])
> .Symbolize!(__traits(getMember, E, names[0])),
> EnumSpecificMembers!(names[1 .. $])
> ) EnumSpecificMembers;
> : : :
> ```
>
Orijinali şurada (<https://github.com/D-Programming-Language/phobos/blob/master/std/traits.d#L2324>) ve şablonun tamamı unittest'leri ile birlikte aşağıda...:)
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 > 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;
}
unittest
{
enum A { a }
static assert([ EnumMembers!A ] == [ A.a ]);
enum B { a, b, c, d, e }
static assert([ EnumMembers!B ] == [ B.a, B.b, B.c, B.d, B.e ]);
}
unittest // typed enums
{
enum A : string { a = "alpha", b = "beta" }
static assert([ EnumMembers!A ] == [ A.a, A.b ]);
static struct S
{
int value;
int opCmp(S rhs) const nothrow { return value - rhs.value; }
}
enum B : S { a = S(1), b = S(2), c = S(3) }
static assert([ EnumMembers!B ] == [ B.a, B.b, B.c ]);
}
--
[ Bu gönderi, <http://ddili.org/forum>'dan dönüştürülmüştür. ]