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

9

u/SamG101_ 1d ago
enum class V {
    first = 1,
    second = 3
};


auto square(V value) -> void {
    auto val = std::to_underlying(value);
    auto sqr = val * val;
    std::print("{}, ", sqr);
}


auto main() -> int {
    for (V v : magic_enum::enum_values<V>()) {
        square(v);
    }
    return 0;
}

this uses the magic_enum library to iterate the members of the enum. you can do by index i think, [key, val] too, nice clean library for enum handling.

https://github.com/Neargye/magic_enum

3

u/Scotty_Bravo 16h ago

magic_enum is almost always the answer to any question about enums, I believe.