February 21, 2011
"Jesse Phillips" <jessekphillips+D@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();


1 2
Next ›   Last »