C++ std::to_underlying 函数

2025年3月22日 | 阅读 5 分钟

在本文中,我们将讨论 C++ 中的 std::to_underlying() 函数,包括其语法、参数、优点、缺点和示例。

C++ 中的 std::to_underlying 函数是什么?

std::to_underlying() 函数是一个实用函数,用于获取枚举类型的底层整型值,该函数在 C++17 中添加(头文件)。它是将 enum 转换为整数的一种更安全、更简单的方法,有助于弥合 enum class 和底层整型类型之间的差距。

语法

std::to_underlying 的语法如下

参数

  • EnumType: 需要获取底层值的枚举的类型。
  • Enumerator: 需要获取底层值的枚举类型实例。

返回值

枚举的底层整型类型是 std::to_underlying 的返回类型。

例如,如果枚举类型使用 enum class 或 enum struct 定义,则返回类型将是枚举声明中指定的底层整型类型。

它是如何工作的?

  • 将 EnumType 枚举类型的枚举项作为参数传递给 std::to_underlying。
  • 它使用隐式转换在内部将其转换为其底层整型类型。
  • std::underlying_type 类型特征用于查找底层类型。
  • 该函数返回枚举项的基本整型值。

优点

C++ 中 std::to_underlying() 函数的几个优点。

  • 类型安全: 它保证了从 enum 到整型类型的清晰、明确的转换。
  • 清晰度: 当将 enum 转换为整数的目标清晰明确时,代码会更加具象。
  • 编译时确定: 由于转换是 constexpr,因此可以在编译时进行评估。
  • 防止错误: 它有助于避免不同 enum 类型之间的无意转换或比较。

缺点

C++ 中 std::to_underlying() 函数的几个优点。

  • C++20 要求: 只有 C++20 及更高版本支持 std::to_underlying。对于以旧标准为目标的代码库,此功能不可用。
  • 仅限整型底层类型: 它仅用于具有整型底层类型的枚举。无法支持以类类型或浮点类型作为其底层类型的枚举。

用途

  • 通常在需要使用枚举项的底层整型值执行操作的情况下使用 std::to_underlying() 函数。
  • 枚举项的整型形式可能需要用于赋值、比较或任何其他类型的操作。

示例

让我们举一个例子来说明 C++ 中的 std::to_underlying 函数。

输出

 
The underlying value of Color::Green is: 2   

说明

以下实现演示了我们可以使用 std::to_underlying 函数,该函数已在 C++20 中引入,用于获取与枚举关联的基本值。

  • 头文件包含和枚举定义: 为了调用 std::to_underlying,我们的应用程序首先包含头文件。然后,它创建一个使用底层类型 uint8_t 的 Color 实例。通过应用 enum class 语法,源代码构建了一个完全类型的枚举,该枚举避免了隐式转换,增强了类型安全性和可读性。底层类型 uint8_t 确保枚举成员保持不变,作为 8 位无符号整数,这可能有助于最小化内存。
  • 创建枚举实例: 在 main 函数中,创建了一个 Color 枚举实例并赋值为 Color::Green。这演示了如何通过使用预定义值进行初始化来处理枚举。选择 Color::Green 是任意的,但它展示了如何与 enum 值进行交互。
  • 提取底层值: 示例的核心是使用 std::to_underlying。此函数应用于 color 实例,提取其底层整数值。调用 std::to_underlying(color) 返回值 2,对应于 Color::Green。此函数提供了一种简单且类型安全的方法来获取枚举值的整型表示,避免了手动转换和潜在的错误。
  • 输出结果: 最后,程序使用 std::cout 打印底层值。使用 static_cast<int> 来确保值以整数形式显示。此转换将 uint8_t 值转换为更熟悉的整数类型以供显示。程序的输出证实 Color::Green 的底层值为 2,这表明 std::to_underlying 函数正确地从枚举中检索了整型值。

复杂度

C++ 中使用的 std::to_underlying 函数是 C++20 中引入的一种便捷功能,它提供了一种简单的方法来检索枚举的基本整型结构。上述技术是该头文件的一部分,在与包含除默认 int 之外的指定底层类型的枚举进行通信时很有用。

C++ 中的枚举结构可以包含一个可识别的底层类型,例如 enum class Color: unsigned char {Red, Green, Blue };。枚举的底层类型默认为 int,但使用其他类型可以帮助优化其内存消耗以及使用需要专用整型类型的 API 进行接口。std::to_underlying 技术使程序员能够以清晰且类型安全的方式检索底层类型。

std::to_underlying 的开销非常小。该方法通常使用对枚举底层类型的简单转换来实现。这意味着,假设我们有一个枚举 Color: unsigned char { Red, Green, Blue };,使用 std::to_underlying(Color::Red) 将会把 Color::Red 枚举项转换为 unsigned char。上述过程通常是有效的,并且需要常量时间 O(1),因为它只需要类型转换过程,而没有复杂的计算。

结论

总而言之,C++20 中实现的 std::to_underlying 函数的引入是与当前 C++ 等编程语言中的枚举交互的重要增强。它通过提供一种类型安全且简单的方法来检索给定枚举的底层整型值,使开发人员能够编写更清晰、更具描述性的代码。该函数解决了日益普遍的程序员需求:在不使用危险转换和繁琐的类型操作的情况下,获取 enum 值的未压缩基本模型。

std::to_underlying 的简洁性增强了其整体效率,考虑到它几乎没有开销就完成了其预期功能,并且通常在常量时间内完成。这种效率可以通过直接转换为底层类型来实现,因此,确保整个过程快速且可预测。

此外,std::to_underlying 强调了 C++ 不断发展的性质,以支持更安全、更直观的编程实践。通过将此函数纳入标准库,C++20 为开发人员提供了增强代码清晰度和可维护性的工具。因此,std::to_underlying 不仅简化了与枚举的交互,还加强了语言中类型管理的最佳实践。


下一个主题C++ 替代方案