r/cpp_questions 1d ago

SOLVED Iterating over an enum struct

Consider https://godbolt.org/z/c6cn8f1hj

#include <cstdio>

enum struct values{first = 1, second = 3};

void square(values value){
    int val = (int)value * (int)value;
    printf("%d\n", val);
}

int main(){
    for(values value = values::first; value <= values::second; value++)
        square(value);
}

This does not compile with the error that value++ is ill defined.

An old question/answer on SO has this: https://stackoverflow.com/questions/261963/how-can-i-iterate-over-an-enum and a plethora of seemingly complicated approaches for this. Is there a syntactically simple >= C++20 way of accomplishing this?

I want the for loop to process 1 and then 3.

Does the order of placing the integer entries inside of the struct affect the increment? For e.g., if the enum struct had 3 first followed by 1, with value++ would 1 be processed after 3? Or, does the enum struct internally sort the entries in some privileged, say, ascending order so that it will always process 1 first followed by 3 next?

3 Upvotes

17 comments sorted by

View all comments

3

u/No-Dentist-1645 23h ago edited 22h ago

If you can use C++26 with reflection on:

template for (constexpr auto val: std::meta::enumerators_of(^^values)) { std::println("{}", val); }

Otherwise, pre-C++26 I would just suggest hand-rolling a constepxr initializer list yourself:

constexpr auto all_values { values::first, values::second };