CTFE & enums & static assert
Robert M. Münch via Digitalmars-d-learn
digitalmars-d-learn at puremagic.com
Mon May 18 03:33:07 PDT 2015
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
More information about the Digitalmars-d-learn
mailing list