On Sunday, 24 June 2018 at 17:23:54 UTC, Steven Schveighoffer wrote:
static if(__traits(compiles, fastEnumToString(val)))
  return fastEnumToString(val);
else
  return slowEnumToString(val); // checks for duplicates

Should eliminate the issues, because it's not going to compile the slow version if the fast version can work.

-Steve

Yes, I thought about that too, but the problem is that std.conv.to is used in std.stdio and I don't want to remember to always to do

    writeln("Some text:", x.to!string);

instead of

    writeln("Some text:", x);

for some enum instance `x`.

I'm gonna hack up another solution

struct Enum(E)
if (is(E == enum))
{
    @property string toString() @safe pure nothrow @nogc
    {
        // fast implementation
    }
    E _enum;
    alias _enum this;
}

Further, it just struck me that we can generalize my fast solution to include enumerations with enumerator aliases that are defined directly after its original enumerator by checking with a `static if` if the current enumerator value equals the previous then we skip it. I'm gonna post the solution here after some hacking.

Reply via email to