"Jesse Phillips" <jessekphillip...@gmail.com> wrote in message news:ij2drt$1mq3$1...@digitalmars.com... > > Magic. > > No really, the best I can tell is that the compiler will try to run the > foreach loop at compile-time if there is something in the body that must > be evaluated at compile time. >
Actually this happens because __traits(allMembers ...) returns a TypeTuple of string literals. TypeTuples can contain elements of different types (and types themselves as elements), so in order for them to be used in foreach loops, they MUST be unrolled. It's not something in the body, it's the iterable itself that forces unrolling. http://www.digitalmars.com/d/2.0/tuple.html You can do LOTS of cool stuff with this: switch(x) { foreach(i; TypeTuple!(1, 2, 6, 8, 17)) case i: doSomething(); } --------------- class C {} class D : C {} class E : C {} class F : C {} class G : C {} C[] list; foreach(T; TypeTuple!(D, E, F, G)) list ~= new T(); ---------------- int id = runtimeInput(); foreach(i, T; TypeTuple!(C, D ,E, F, G, H)) if (i == id) return new T();