Making enum join variadic

"Nordlöw" via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Thu May 1 15:24:10 PDT 2014


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);
}


More information about the Digitalmars-d-learn mailing list