enum inheritance?

Simen Kjaeraas simen.kjaras at gmail.com
Sat Aug 13 17:42:37 PDT 2011


On Sun, 14 Aug 2011 01:15:29 +0200, mimocrocodil <4denizzz at gmail.com>  
wrote:

> Hi!
>
> I am want to extend available enum to provide more items to them.
>
> How I can do this job without manual copying of exsisting enum items?

If what you want is a new enum that contains the values of an existing  
enum,
with some additions, this code will do it:


string EnumDefAsString(T)() if (is(T == enum)) {
     string result = "";
     foreach (e; __traits(allMembers, T)) {
         result ~= e ~ " = T." ~ e ~ ",";
     }
     return result;
}

template ExtendEnum(T, string s) if (is(T == enum) &&  
is(typeof({mixin("enum a{"~s~"}");}))) {
     mixin("enum ExtendEnum {" ~
         EnumDefAsString!T() ~ s ~
     "}");
}

unittest {
     enum bar {
         a = 1,
         b = 7,
         c = 19
     }

     import std.typetuple;

     alias ExtendEnum!(bar, q{ // Usage example here.
         d = 25
     }) bar2;

     foreach (i, e; __traits(allMembers, bar2)) {
         static assert( e == TypeTuple!("a", "b", "c", "d")[i] );
     }

     assert( bar2.a == bar.a );
     assert( bar2.b == bar.b );
     assert( bar2.c == bar.c );
     assert( bar2.d == 25 );

     static assert(!is(typeof( ExtendEnum!(int, "a"))));
     static assert(!is(typeof( ExtendEnum!(bar, "25"))));
}
-- 
   Simen


More information about the Digitalmars-d-learn mailing list