如何通过std-underlying-type_c获取枚举的核心底层类型?
- 内容介绍
- 文章标签
- 相关推荐
本文共计1040个文字,预计阅读时间需要5分钟。
它不是函数,也不是宏,而是一个类型别名模板——因此你不能像调用函数那样使用它。正确的用法是:
它的作用只有一个:从枚举类型反推它背后实际存储用的整数类型(比如 int、unsigned char),这对序列化、位操作、跨平台内存布局控制很关键。
- 必须传入一个**已定义的枚举类型名**,不能是枚举值或未声明的 enum
- 对
enum class和传统enum都有效,但传统enum的底层类型可能由编译器推导,不显式指定时不可靠 - C++11 起可用,头文件是
<type_traits>
怎么正确获取并使用底层类型
最常用写法是搭配 typename 和 ::type,尤其在模板中需要声明变量或做类型判断时:
enum class Status : uint8_t { OK = 0, ERROR = 1 }; using underlying_t = typename std::underlying_type<Status>::type; static_assert(std::is_same_v<underlying_t, uint8_t>); // ✅ 通过
如果只是临时转换一个枚举值,更简洁的是用 std::to_underlying(C++23 新增),但它和 std::underlying_type 不是一回事——后者是类型,前者是函数。
本文共计1040个文字,预计阅读时间需要5分钟。
它不是函数,也不是宏,而是一个类型别名模板——因此你不能像调用函数那样使用它。正确的用法是:
它的作用只有一个:从枚举类型反推它背后实际存储用的整数类型(比如 int、unsigned char),这对序列化、位操作、跨平台内存布局控制很关键。
- 必须传入一个**已定义的枚举类型名**,不能是枚举值或未声明的 enum
- 对
enum class和传统enum都有效,但传统enum的底层类型可能由编译器推导,不显式指定时不可靠 - C++11 起可用,头文件是
<type_traits>
怎么正确获取并使用底层类型
最常用写法是搭配 typename 和 ::type,尤其在模板中需要声明变量或做类型判断时:
enum class Status : uint8_t { OK = 0, ERROR = 1 }; using underlying_t = typename std::underlying_type<Status>::type; static_assert(std::is_same_v<underlying_t, uint8_t>); // ✅ 通过
如果只是临时转换一个枚举值,更简洁的是用 std::to_underlying(C++23 新增),但它和 std::underlying_type 不是一回事——后者是类型,前者是函数。

