https://issues.dlang.org/show_bug.cgi?id=23272
--- Comment #3 from Iain Buclaw <[email protected]> --- Possible reduction of the original. --- alias AliasSeq(TList...) = TList; template EnumMembers(E) { alias EnumMembers = AliasSeq; static foreach (M; __traits(allMembers, E)) EnumMembers = AliasSeq!(__traits(getMember, E, M)); } struct SumType(Ts) { mixin(() { auto s = "enum Cases : ubyte {"; return s ~= "unset}\n"; }()); Cases which; union { Ts cases; } } auto caseOfTemplated(alias func, T)(T s) { final switch (s.which) foreach(CASE; EnumMembers!(T.Cases)) { case CASE: return func(s.cases); } } void foo() { bool validate() { SumType!(int) s; caseOfTemplated!(a => typeid(a))(s) == typeid(string); return true; } static assert(validate); } --
