How can I make `join` variadic (by filling in njoin) in the following code?

import std.stdio: writeln;
import std.traits;

string enumsHelper(S...)(S s)
{
    typeof(return) r;
    foreach (i, e; s)
    {
        if (i >= 1)
            r ~= ", ";
        r ~= e;
    }
    return r;
}

/** Join/Chain/Concatenate/Unite Enums $(D E1), $(D E2), ... into $(D E). See also: http://forum.dlang.org/thread/f9vc6p$1b7k$1...@digitalmars.com
*/
template join(string E, E1, E2)
{
    const join = ("enum " ~ E ~ " { " ~
                   enumsHelper(__traits(allMembers, E1)) ~ "," ~
                   enumsHelper(__traits(allMembers, E2)) ~ " }"
        );
}

template njoin(string E, Ei...)
{
    import std.algorithm: map;
    enum string njoin = "enum " ~ E ~ " { " ~ "" ~ " } ";
}

void main(string[] args)
{
    enum E1 { A, B, C }
    enum E2 { E, F, G }
    mixin(join!("E12", E1, E2));
    E12 e12;
    writeln(e12.min, ",", e12.max);
}

Reply via email to