Wed, 21 Jan 2009 12:48:07 +0100, Trass3r wrote: > Christopher Wright schrieb: >> On the other hand, you can get the non-final, non-private methods of a >> class with something like: >> foreach (member; __traits (allMembers, Class)) >> { >> foreach (overload; __traits (getVirtualFunctions, Class, member)) >> { >> // do stuff >> } >> } >> >> Naturally, __traits and foreach don't mix, so you'll have to use >> template recursion. This is pretty damn ugly. >> > > But why doesn't that work? It doesn't even work when forced to run at > compile time by CTFE. > Had a look at the compiler code, it uses the same mechanism as > pragma(msg, for example, so shouldn't something like the above > theoretically be possible?
foreach() is a runtime construct. It may be *interpreted* at compile-time, but it's interpreted as if it were run time nevertheless. It dynamically changes the value of 'member' variable. pragma() and __traits() are compile-time constructs. They are fully and statically expanded before anything is being interpreted and cannot handle dynamically changing variables.