如何通过std-underlying-type_c获取枚举的核心底层类型?

2026-05-07 15:280阅读0评论SEO资讯
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计1040个文字,预计阅读时间需要5分钟。

如何通过std-underlying-type_c获取枚举的核心底层类型?

它不是函数,也不是宏,而是一个类型别名模板——因此你不能像调用函数那样使用它。正确的用法是:

它的作用只有一个:从枚举类型反推它背后实际存储用的整数类型(比如 intunsigned 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 不是一回事——后者是类型,前者是函数。

阅读全文
标签:C

本文共计1040个文字,预计阅读时间需要5分钟。

如何通过std-underlying-type_c获取枚举的核心底层类型?

它不是函数,也不是宏,而是一个类型别名模板——因此你不能像调用函数那样使用它。正确的用法是:

它的作用只有一个:从枚举类型反推它背后实际存储用的整数类型(比如 intunsigned 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 不是一回事——后者是类型,前者是函数。

阅读全文
标签:C