April 11, 2011 Re: How do I iterate over enum members at runtime? | ||||
---|---|---|---|---|
| ||||
Posted in reply to Jesse Phillips | Jesse Phillips <jessekphillips+d@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 |
April 11, 2011 Re: How do I iterate over enum members at runtime? | ||||
---|---|---|---|---|
| ||||
Posted in reply to Dan Olson | On 4/11/11, Dan Olson <zans.is.for.cans@yahoo.com> wrote:
> 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
>
Nice find, thanks!
|
Copyright © 1999-2021 by the D Language Foundation