enum FromEnum {F1 = 10, F2, F3}
enum ToEnum {T1 = 20, T2, T3}
enum CharEnum : char {C1 = 'c', C2, C3}
static assert(to!ToEnum(FromEnum.F2) == ToEnum.T2);
static assert(to!ToEnum(FromEnum.F2) == 21);
static assert(to!CharEnum(FromEnum.F2) == CharEnum.C2);
static assert(to!CharEnum(FromEnum.F2) == 'd');
T to(T, F)(F f) if (is(F==enum) && is(T == enum))
static foreach (E; AliasSeq!(T, F))
static assert(NoDuplicates!(EnumMembers!E).length == EnumMembers!E.length,
E.stringof ~ " has duplicates.");
static assert(EnumMembers!F.length == EnumMembers!T.length,
F.stringof ~ " and " ~ T.stringof ~ " differ in length.");
static foreach(i, t; EnumMembers!T)
assert(0, "Not an enum member");
static size_t rank(E)(E e) if (is(E == enum))
static foreach (i, member; EnumMembers!E)
assert(0, "Not an enum member");