On Sunday, 24 June 2018 at 23:21:44 UTC, Steven Schveighoffer
wrote:
@property string toString() @safe pure nothrow @nogc
{
final switch (_enum)
{
static foreach (index, member;
__traits(allMembers, E))
{
static if (index == 0 ||
(__traits(getMember, E,
__traits(allMembers, E)[index - 1]) !=
__traits(getMember, E, member)))
{
case __traits(getMember, E, member):
return member;
}
}
}
}
E _enum; // the wrapped enum
alias _enum this;
}
Provided that
__traits(allMembers, E)
is a cheap operation as it's called once for every enumerator. I
could get it out of the loop; if I do as
@property string toString() @safe pure nothrow @nogc
{
final switch (_enum)
{
enum members = __traits(allMembers, E);
static foreach (index, member; __traits(allMembers,
E))
{
static if (index == 0 ||
(__traits(getMember, E, members[index
- 1]) !=
__traits(getMember, E, member)))
{
case __traits(getMember, E, member):
return member;
}
}
}
}
the compiler complains as
enum_ex.d(19,29): Error: expression expected as second argument
of __traits `getMember`
Is
__traits(allMembers, ...)
cached by the compiler?