Search code examples
c++enumsc++11

Underlying type of a C++ enum in C++0x


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;
}

Solution

  • I haven't read any C++0x stuff so I couldn't comment on that.

    As for serializing, you don't need the switch when reading the enum back in - just cast it to the enum type.

    However, I don't cast when writing to the stream. This is because I often like to write an operator<< for the enum so I can catch bad values being written, or I can then decide to write out a string instead.

    enum color { red, green, blue };
    color c = red;
    
    // to serialize
    archive << c;    // Removed cast
    
    // to deserialize
    int i;
    archive >> i;
    c = (color)i;    // Removed switch