Making enum join variadic
    "Nordlöw" via Digitalmars-d-learn 
    digitalmars-d-learn at puremagic.com
       
    Fri May  2 06:38:38 PDT 2014
    
    
  
On Friday, 2 May 2014 at 12:45:44 UTC, Nordlöw wrote:
>> I'd be verbose. It's an uncommon operation, bound to surprise 
>> a reader
>> a bit.It's better to type a few more letters.
>
> See update.
>
>> I did not try to compile it, but what happens if the enum 
>> elements
>> have the same name ? The same min/max/values ?
>>
>> Like this:
>>
>> enum E1 { a, b, c }
>>
>> alias E111 = join!(E1, E1, E1);
>
> This should give a better error message, than current mixin 
> error.
> I'll work on that.
>
>> I would put it in std.typecons, since it's a type constructor
>
> Ok.
>
> Thx!
Here's my try at detecting member names collision at compile time:
template MemberNamesUnion(E...) if (allSatisfy!(isEnum, E))
{
     bool[string] allMembers;   // used to detect member collisions
     mixin({
             string r = "enum MemberNamesUnion { ";
             foreach (T; E) {
                 import std.range: join;
                 foreach (member; __traits(allMembers, T)) {
                     static assert (member in allMembers, "Member 
collision");
                     allMembers[member] = true;
                 }
                 r ~= [__traits(allMembers, T)].join(",") ~ ",";
             }
             return r ~ " }";
         }());
}
It fails as
enums.d(25,46): Error: static variable allMembers cannot be read 
at compile time
enums.d(25,21):        while evaluating: static assert("a" in 
allMembers)
Is there a solution to this problem?
    
    
More information about the Digitalmars-d-learn
mailing list