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