如何更改枚举(C++)使用的整数类型
How to change the integer type used by an enum (C++)?
如果我有C++枚举:
enum Foo
{
Bar,
Baz,
Bork,
};
如何告诉编译器使用uint16_t
来实际存储枚举的值?
编辑:GCC在C++11的实现中支持这个功能吗?
在C++98/03中无法执行此操作。C++11确实允许你这样做,并且没有enum class
,就像其他人一直告诉你的那样:
enum EnumType : uint16_t
{
Bar,
Baz,
Bork,
};
同样,您不必使用enum class
。并不是说这是个坏主意,但你不需要。
GCC在实现C++11时是否支持此功能?
GCC的哪个版本?看起来GCC 4.4添加了这个功能,但为了稳定起见,您可能应该查看更新的版本。
在C++11中,您可以执行以下操作:
enum class Foo : uint16_t
{
Bar,
Baz,
Bork,
};
稍后,您还可以知道枚举的底层类型为:
#include <type_traits>
std::underlying_type<Foo>::type v = 10; //v is uint16_t
有了c++11
,现在就有了enum class
,可以显式设置底层类型:
enum class Foo: uint16_t
{
Bar,
Baz,
Bork,
};
对于C++2011之前的版本,您可以通过使用合适的值范围来强制实现最小存储:
enum foo {
v0 = 0,
vmax = 32767
};
我认为编译器可以自由地选择有符号或无符号整数类型作为基础类型。上述范围强制表示至少使用short
作为其基础整数。使其更大可能会导致它使用long
。当然,这只是强制一个最小的范围,编译器可以自由选择一个更大的范围。此外,根据上述定义,您不允许偏离范围[0, 32767]
:如果您确实需要16位范围(至少),则需要使用相应的值)。
相关文章:
- 整数类型应该显式转换(例如"int"到"无符号")还是只会增加混乱?
- 涉及旧式枚举和整数类型的重载解析
- 将字符串转换为整数类型T,检查是否存在溢出
- 整数文本太大,无法用任何整数类型表示--C++
- isdigit(c) - 字符或整数类型?
- 为什么对小于 4 个字节的整数类型的位操作会发生意外行为?
- C++模板专用化 - 将其他整数类型委托给uint64_t
- 何时应使用 C++ 固定宽度整数类型,它们如何影响性能?
- 根据浮点数选择最小整数类型
- 为什么 QVariant 将字符类型视为整数类型
- 我们可以在整数类型的双指针中分配2D整数数组的地址吗?怎么可能
- 默认情况下,决定整数类型是唱歌或无符号的类型
- 是否可以根据类型是整数类型还是浮点类型重载模板函数
- 使用固定整数类型的安全性
- 如何使用条件来检查类型名 T 是否是 C++ 中浮点类型的整数类型
- C++文本整数类型
- 哪种整数类型可以安全且便携式用于始终保持指针值
- 检测整数类型变量上的空白输入
- 为什么对Chrono :: Nanseconds的表示类型是签名的整数类型
- 如何处理警告:从较小的整数类型int转换为int*