Fun with allMembers

Denis Koroskin 2korden at gmail.com
Thu May 14 11:52:12 PDT 2009


On Thu, 14 May 2009 19:24:23 +0400, Andrei Alexandrescu <SeeWebsiteForEmail at erdani.org> wrote:

> Shin Fujishiro wrote:
>> Hi,
>>  I've had fun with the allMembers traits over the past few days and  
>> found
>> it more powerful than I thought.
>>  __traits(allMembers, T) returns the member names of T. As some might
>> already know, T is not restricted to a class or struct; it can also be
>> an enum, template, or even module. Try this:
>> --------------------
>> enum E { a, b, c }
>> template T() { int x, y, z; }
>> import std.stdio;
>> pragma(msg, __traits(allMembers, E).stringof);
>> pragma(msg, __traits(allMembers, T).stringof);
>> pragma(msg, __traits(allMembers, std.stdio).stringof);
>> --------------------
>> You'll like the result :). It must be usable!
>>  For example, using allMembers with enums, I could implement
>> enumToString and enumFromString without defineEnum.
>> Code: http://codepad.org/HVvPjoI7
>>  So, what other uses could there be?
>
> Wow, I didn't know about this! It might as well be everything needed for  
> a full-blown compile-time reflection package!
>
> To answer your question: for starters, try to implement BlackHole and  
> WhiteHole as explained here:
>
> http://erdani.dreamhosters.com/cranking-policies-up.pdf
>
>
> Andrei

I wonder why it says "No popular compiled language offers both" about CT introspection and code generation?



More information about the Digitalmars-d mailing list