Subtyping of an enum

Alex sascha.orlov at gmail.com
Mon Apr 15 10:45:26 UTC 2019


On Monday, 15 April 2019 at 10:15:50 UTC, Anton Fediushin wrote:
> On Monday, 15 April 2019 at 10:00:36 UTC, Alex wrote:
>
> Enum.internal is private to make it inaccessible from any other 
> place. All I want is a way to have an enum that I could extend 
> with my own methods.
>
> Something to make the following code work:
> ```
> Enum a = Enum.foo;
> Enum b = Enum.bar;
> assert(a == Enum.foo);
> assert(a < b);
> assert(a.toString == "FOO");
> assert(b.toString == "BAR");
> writeln(a); // FOO
> writeln(b); // BAR
> ```

This would:

´´´

struct Enum {
   private {
     enum internal {
       foo,
       bar
     }
     internal m_enum;
   }
   this(internal i) { m_enum = i; }
   alias m_enum this;
   string toString() {
     if(m_enum == internal.foo)
         return "FOO";
     else
         return "BAR";
   }
}

void fun(Enum e) {}


void main(){
     import std.stdio;
     fun(Enum.init);
     Enum a = Enum.foo;
     Enum b = Enum.bar;
     assert(a == Enum.foo);
     assert(a < b);
     assert(a.toString == "FOO");
     assert(b.toString == "BAR");
     writeln(a); // FOO
     writeln(b); // BAR
}
´´´

Assuming, that automatic generation of "FOO" from foo was not 
part of your question :-p


More information about the Digitalmars-d-learn mailing list