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?

Reply via email to