On Thursday, 26 April 2018 at 16:10:16 UTC, Timoses wrote:
Is it possible to use a template to place the "static foreach" looping to find the correct enum value into? Like I am trying in the initial "draft" GetMenum?

As the compiler says, the value of `e` is not known at compile-time. In order to correctly instantiate the template with that value, all possible instantiations must be instantiated, and the correct one chosen by a static foreach, just like you do.

The only step you're missing is the template needs to be instantiated inside the static foreach, like this:

auto instantiateWith(alias Fn, T)(T x)
if (is(T == enum))
{
    import std.traits : EnumMembers;
    switch (x)
    {
        static foreach (e; EnumMembers!T)
            case e:
                return Fn!e;
        default:
            assert(false);
    }
}

enum menum { A, B, C }

template Temp(menum m)
{
    enum Temp = m.stringof;
}

unittest {
    menum m = menum.A;
    import std.stdio;
    assert(instantiateWith!Temp(m) == Temp!(menum.A));
    m = menum.B;
    assert(instantiateWith!Temp(m) == Temp!(menum.B));
    m = menum.C;
    assert(instantiateWith!Temp(m) == Temp!(menum.C));
}

--
  Simen

Reply via email to