CTFE & enums & static assert

Ali Çehreli via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Mon May 4 11:22:17 PDT 2015


On 05/04/2015 11:07 AM, Robert M. Münch wrote:

 > enum A {a, b, c};
 >
 > enum members1 = __traits(allMembers, A);
 > auto members2 = __traits(allMembers, A);
 >

 > 1. So the (string, string, string) output is based on the expression of
 > members1? Meaning, the right-hand-side.

There are many different kinds of tuples in D, only two of which I can 
handle:

1) Tuple from std.typecons, which are ordinarily created at run time

2) TypeTuple from std.typetuple, which are compile-time entities

The documentation is not clear that __traits(allMembers) returns a 
TypeTuple, which additionally has a bad name.

TypeTuple is great because it enables "compile-time foreach" 
(unfortunately, implicitly):

     foreach (m; __traits(allMembers, A)) {
         // This body is repeated for each member at compile time
     }

It is also possible to expand members of a TypeTuple just by putting it 
inside an array:

   [ __traits(allMembers, A) ]On 05/04/2015 11:07 AM, Robert M. Münch wrote:

 > enum A {a, b, c};
 >
 > enum members1 = __traits(allMembers, A);
 > auto members2 = __traits(allMembers, A);
 >

 > 1. So the (string, string, string) output is based on the expression of
 > members1? Meaning, the right-hand-side.

There are many differents kinds of tuples in D, only two of which I can 
handle:

1) Tuple from std.typecons, which are ordinarily created at run time

2) TypeTuple from std.typetuple, which are compile-time entities

The documentation is not clear that __traits(allMembers) returns a 
TypeTuple, which additionally has a bad name.

TypeTuple is great because it enables "compile-time foreach" 
(unfortunately, implicitly):

     foreach (m; __traits(allMembers, A)) {
         // This body is repeated for each member at compile time
     }

It is also possible to expand members of a TypeTuple just by putting it 
inside an array:

   [ __traits(allMembers, A) ]

However, it should be obvious that all members must have a common type 
to be members of the same array. (True to its name, TypeTuple can have 
types themselves as well.)

Powerful stuff. :)

 > 2. I'm wondering why members1 doesn't has a type at all.

Because it is a TypeTuple of values of various types and even types 
themselves.

 > So, we don't
 > have a compile-time boolean?

I don't understand that one. :(

Ali


However, it should be obvious that all members must have a common type 
to be members of the same array. (True to its name, TypeTuple can have 
types themselves as well.)

Powerful stuff. :)

 > 2. I'm wondering why members1 doesn't has a type at all.

Because it is a TypeTuple of values of various types and even types 
themselves.

 > So, we don't
 > have a compile-time boolean?

I don't understand that one. :(

Ali



More information about the Digitalmars-d-learn mailing list