How do I iterate over enum members at runtime?
    Dan Olson 
    zans.is.for.cans at yahoo.com
       
    Sun Apr 10 20:07:12 PDT 2011
    
    
  
Jesse Phillips <jessekphillips+d at gmail.com> writes:
> On Sat, 09 Apr 2011 16:20:06 -0400, Andrej Mitrovic wrote:
>
>> I know there's traits to get strings at compile time, e.g.: auto b = [
>> __traits(allMembers, Metrics) ];
>> 
>> but this doesn't help me try out those enum values at runtime. It could
>> almost work if I could use a mixin() in a foreach loop, but that's lucid
>> dreaming.
>> 
>> Another alternative might be to create an array out of the enum, but I
>> don't know of any way of doing this.
>
> You have everything you need, just put them all together:
>
> enum Metrics : int
> {
> 	SM_CXSCREEN = 0,
> 	SM_CYSCREEN,
> 	SM_CXVSCROLL,
> 	SM_CYHSCROLL,
> 	SM_CYCAPTION,
> 	SM_CXBORDER,
> }
>
> void foo(int m)
> {
> }
>
> void main()
> {
>     foreach (m; __traits(allMembers, Metrics))
>     {
>         foo(mixin("Metrics." ~ m));
>     }
> }
I'm exploring more and found there is also std.traits.EnumMembers.  It's
a little simpler:
    foreach (m; EnumMembers!Metrics))
    {
        foo(m);
    }
And for number of members in enum Metrics
    EnumMembers!Metrics.length
-- 
Dan
    
    
More information about the Digitalmars-d-learn
mailing list