template with enum arg ?

Ali Çehreli via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Wed Jun 8 14:52:01 PDT 2016


On 06/08/2016 10:02 AM, chmike wrote:
>
> In a first implementation I defined a named enum in my class which I
> could use with my template function foo.
>
> ----
> final class Info {
>     ...
>     enum Value { info_1 = 1, ... }
>     ...
>     static bar(Value e) {...}
> }
>
> void foo(T)(T.Value e) { T.bar(e); }
>
> ----
>
> I could then write : foo(Info.Value.info_1);
>
> I would prefer to write : foo(Info.info_1);
>
> If I change the enum into an anonymous enum the template doesn't work
> anymore.
>
> How could I solve this ?
>
> Also, do I need a template argument filter if() ?

One way is to bring the enum values to the class scope:

     alias info_1 = Value.info_1;

Which can be automated with a mixin:

string expandEnumMembers(E)() {
     string result;

     foreach (m; __traits(allMembers, E)) {
         import std.string : format;
         result ~= format("alias %s = %s.%s;", m, E.stringof, m);
     }

     return result;
}

final class Info {
     enum Value { info_1 = 1, info_2 }

     mixin (expandEnumMembers!Value());

     static bar(Value e) {}
}

void foo(T)(T.Value e) {
     T.bar(e);
}

void main() {
     foo(Info.info_1);
     foo(Info.info_2);
}

To see at compile time what is being mixed in, insert the following 
somewhere in your code:

pragma(msg, expandEnumMembers!(Info.Value));

Ali



More information about the Digitalmars-d-learn mailing list