I've been trying to read a bit of the C++ standard to figure out how enum's work. There's actually more there than I originally thought.
For a scoped enumeration, it's clear that the underlying type is int
unless otherwise specified with an enum-base clause (it can be any integral type).
enum class color { red, green, blue}; // these are int
For unscoped enumerations, it seems like the underlying type can be any integral type that will work and that it won't be bigger than an int, unless it needs to be.
enum color { red, green, blue}; // underlying type may vary
Since the underlying type of unscoped enumarations are not standardized, what's the best way of dealing with serializing instances of one? So far, I've been converting to int
when writing then serializing into an int
and setting my enum
variable in a switch when reading, but it seems a bit clunky. Is there a better way?
enum color { red, green, blue };
color c = red;
// to serialize
archive << (int)c;
// to deserialize
int i;
archive >> i;
switch(i) {
case 0: c = red; break;
case 1: c = green; break;
case 2: c = blue; break;
}
Best Answer
enum class is a C++0x feature, it is not present in C++03.
Examples (from the wikipedia article):
As for the serialization part (which I think was not part of the original question), I prefer to create a helper class that translates enum items into their string equivalent (and back), as the names are usually more stable than the integer values they represent, as enum items can be (and sometimes are) reordered without changing the code behavior.