Constructing an enum using the members of an AliasSeq as enumerator names

Nordlöw via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Wed Apr 27 04:06:41 PDT 2016


On Wednesday, 27 April 2016 at 10:49:54 UTC, Nordlöw wrote:
> What's the easiest way to create an `enum` using the symbol 
> names of an `AliasSeq` as enumerator names?

/** Returns: a `string` containing the definition of an `enum` 
named `name` and
     with enumerator names given by `Es`, optionally prepended 
with `prefix` and
     appended with `suffix`.

     TODO Move to Phobos std.typecons
*/
string makeEnumDefinitionString(string name,
                                 string prefix = `_`,
                                 string suffix = ``,
                                 Es...)()
     if (Es.length >= 1)
{
     typeof(return) s = `enum ` ~ name ~ ` { `;
     foreach (E; Es)
     {
         s ~= prefix ~ E.stringof ~ suffix ~ `, `;
     }
     s ~= `}`;
     return s;
}

@safe pure nothrow @nogc unittest
{
     import std.meta : AliasSeq;
     alias Types = AliasSeq!(byte, short);
     mixin(makeEnumDefinitionString!("Type", `_`, `_`, Types));
     static assert(is(Type == enum));
     static assert(Type._byte_.stringof == "_byte_");
     static assert(Type._short_.stringof == "_short_");
}

Can it be made more elegant?

Destroy!


More information about the Digitalmars-d-learn mailing list