On 2015-05-15 17:26:50 +0000, Ali Çehreli said:

On 05/15/2015 09:45 AM, Robert M. Münch wrote:

 > Is there a way I can build an ENUM from within the FOREACH? What I want
 > to achive is, that I would like to use:
 >
 > final switch (myEnum) ...

Sorry, I don't understand your question. :(

Do you want to define an enum at compile time? Then you can use mixins.

Do you want to build an enum value inside the foreach? Yes, it is possible as well.

Hi, yes to both. I have solved it now like this:

enum A {a, b, c};
enum members1 = __traits(allMembers, A); // returns TypeTuple

// function that generates a string which is used as a mixin at compile time
// result string must conform to syntax as it was hand-written code
string generateEnum(T...)(string type){
   string code = "enum " ~ type ~ " {";

   // this is a static foreach (compile time)
   foreach(m; T){
     debug pragma(msg, m ~ ","); // check what code we get at compile time
     code ~= m ~ ",";
   }

   return(code ~ "}");
}

int main(){
   A switch_var_a;
   final switch(switch_var_a){
     case A.a:
     case A.b:
     case A.c:
   }

   mixin(generateEnums!members1("B"));
   B switch_var_b;
   final switch(switch_var_b){
     case B.a:
//      case B.b: // if commeted will cause a compiler error
     case B.c:
   }

   return(0);
}

So, the solution was to use a "string mixin".

IMO it's a very powerful pattern to build an ENUM at compile time that can be used with a FINAL SWITCH.

--
Robert M. Münch
http://www.saphirion.com
smarter | better | faster

Reply via email to