我一直想读一位C ++标准的要弄清楚如何枚举的工作。这事实上有更多比我原来想象。

有关一个范围的枚举,很明显的是,下面的类型是int除非用枚举基子句另有规定(它可以是任何一体型)。

enum class color { red, green, blue};  // these are int

有关无作用域枚举,它看起来像的基础类型可以是任何类型的积分,将工作,并且它不会比int更大,除非它需要。

enum color { red, green, blue};  // underlying type may vary

由于未范围enumarations的基础类型不规范,什么是处理一个序列化的实例的最佳方法?到目前为止,我已经写转换然后序列化到int,在读取时设置我int变量在开关时enum,但似乎有点笨重。有没有更好的办法?

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;
}
有帮助吗?

解决方案

我还没有读取的任何的C ++ 0x的东西,所以我不能对此作出评论。

至于序列化,你不读回枚举时需要的开关 - 只是将它转换为枚举类型

不过,我不写入流时施放。这是因为我经常喜欢写操作<<对于枚举,所以我能赶上被写入坏的价值观,或者那我可以决定,而不是写出来的字符串。

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

其他提示

我决定创建一个新的答案,因为我年纪那么杂乱。反正只是想说一些关于C ++ 11,在那里你可以使用获得的基础类型的枚举的这一个:

std::underlying_type_t<E>

和感兴趣的缘故,重载决议的想法。但是,请使用名称来存储枚举建议,由@lothar。

在重载解析来源于这样的事实,有存在一个促进从枚举到所述第一INT,无符号整型,长的,无符号长可表示其基础类型的所有值。 A转换到任何其他整数类型较低等级和过载的分辨率不会喜欢它。

char (& f(int) )[1];
char (& f(unsigned int) )[2];

char (& f(long) )[3];
char (& f(unsigned long) )[4];

char const* names[] = { 
    "int", "unsigned int", 
    "long", "unsigned long"
};

enum a { A = INT_MIN };
enum b { B = UINT_MAX };
enum c { C = LONG_MIN };
enum d { D = ULONG_MAX };

template<typename T> void print_underlying() {
    std::cout << names[sizeof(f(T()))-1] << std::endl;
}

int main() { 
    print_underlying<a>();
    print_underlying<b>();
    print_underlying<c>();
    print_underlying<d>();
}

和它打印这一个位置:

int
unsigned int
int
unsigned int

这不是特别感兴趣的该序列化问题(因为序列化的数据的大小是不恒定的宽度,并且当所述计数和其底层类型改变这可能会造成问题),但它通常是有趣弄清楚一种类型的存储整个枚举的。干杯!

#include <type_traits>

enum a { bla1, bla2 };
typedef typename std::underlying_type<a>::type underlying_type;

if (std::is_same<underlying_type, int>::value)
  std::cout << "It's an int!" << endl;
else if (std::is_same<underlying_type, unsigned int>::value)
  std::cout << "It's an uint!" << endl;

至于enum class color:这是C ++ / CLI(C ++ .NET)或将来的C ++ 0x代码

有关序列化,你可以用sizeof(color)得到枚举的规模知道有多少要复制的字节。

scroll top