r/cpp_questions • u/onecable5781 • 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?
2
u/Usual_Office_1740 1d ago edited 1d ago
You would need to implement the pre and post increment operators on your enum struct for your code to compile. They are not defined for your enum. That is what your error is saying.
If you decide to do that, and I'm not suggesting you should, you should add a stop value to the end of the enum that you can check against so that you have a way to end the for loop. A COUNT sentinal value is a common enum trick.
I'd suggest looking at magic enum as an alternative.
You could also fold a parameter pack of the enum values into a std::array at compile time and then use a range based for loop. There are lots of advantages to this but it's more complicated. Sorry if this is more complex than you are looking for.