如何更改枚举(C++)使用的整数类型?

Lin*_*ios 24 c c++ enums

如果我有一个C++枚举:

enum Foo
{
  Bar,
  Baz,
  Bork,
};
Run Code Online (Sandbox Code Playgroud)

如何告诉编译器使用a uint16_t来实际存储枚举值?

编辑:GCC在C++ 11的实现中是否支持此功能?

Nic*_*las 32

你不能在C++ 98/03中这样做.C++ 11确实允许你这样做,并且没有 enum class其他人似乎一直告诉你的方式:

enum EnumType : uint16_t
{
  Bar,
  Baz,
  Bork,
};
Run Code Online (Sandbox Code Playgroud)

同样,你不必使用enum class.不,这是一个坏主意,但你不具备对.


GCC在C++ 11的实现中是否支持此功能?

哪个版本的GCC?看起来GCC 4.4增加了这个功能,但你应该看看更新版本,只是为了稳定.

  • @chris:不,`enum class`和`enum`之间有几个区别.两者都创建范围(上面的`Bar`可以使用`EnumType :: Bar`访问),但只有`class`版本*强制*你使用scoped枚举.另外,`enum class`变量不会*隐式*将整数转换为枚举类型.因此,您必须传递正确类型的实际枚举器,或者必须执行显式强制转换.这增加了*很多*类型安全性. (3认同)

Naw*_*waz 17

在C++ 11中,您可以这样做:

enum class Foo : uint16_t 
{
  Bar,
  Baz,
  Bork,
};
Run Code Online (Sandbox Code Playgroud)

稍后,您还可以知道枚举的基础类型:

#include <type_traits> 

std::underlying_type<Foo>::type v = 10; //v is uint16_t
Run Code Online (Sandbox Code Playgroud)

  • +1用于添加`underlying_type`查询. (4认同)

Lol*_*4t0 5

随着c++11你现在有enum class,它允许你明确地设置基本类型:

enum class Foo: uint16_t 
{ 
   Bar,
   Baz,
   Bork,
}; 
Run Code Online (Sandbox Code Playgroud)


Die*_*ühl 5

使用pre-C++ 2011,您可以使用适当的值范围强制实现最小存储:

enum foo {
    v0 = 0,
    vmax = 32767
};
Run Code Online (Sandbox Code Playgroud)

我认为编译器可以自由选择符号或无符号整数类型作为基础类型.上述范围强制表示至少使用表示short基础整数.使它甚至更大可能会导致它使用long.当然,这只会强制最小范围,编译器可以自由选择更大的范围.此外,根据上述定义,您不允许偏离范围[0, 32767]:如果您确实需要16位范围(至少),则需要使用相应的值).