探索 C++23 std::to_underlying:枚舉底層值獲取的利器

文章目錄

    • 引言
    • 基本概念
    • 作用
    • 使用示例
    • 與之前方法的對比
    • 在 C++23 中的意義
    • 總結

引言

在 C++ 的發展歷程中,每一個新版本都帶來了許多令人期待的新特性和改進,以提升代碼的安全性、可讀性和可維護性。C++23 作為其中的一個重要版本,也不例外。其中,std::to_underlying 這個工具函數便是 C++23 為開發者帶來的一個實用禮物,它主要用于獲取枚舉(enum)的底層值。本文將深入探討 std::to_underlying 的相關內容,包括其基本概念、作用、使用示例、與之前方法的對比以及在 C++23 中的意義。

基本概念

std::to_underlying 是 C++23 標準庫中新增的一個實用工具函數,定義于頭文件 <utility> 中。其函數原型如下:

emplate< class Enum >
constexpr std::underlying_type_t< Enum> to_underlying( Enum e ) noexcept ;

該函數的作用是將枚舉類型轉換為其底層類型,等價于 return static_cast<std::underlying_type_t<Enum>>(e);。這里的 Enum 是枚舉類型,e 是要轉換的枚舉值,函數返回的是 Enum 的底層類型的整數值,從 e 轉換而來。

作用

在實際編程中,我們經常會遇到需要將枚舉值轉換為其底層整數類型的情況。例如,當我們需要與一些無類型的 API 進行交互時,或者在進行日志記錄、流操作等場景下,都可能需要獲取枚舉的底層值。在 std::to_underlying 出現之前,開發者通常會使用 static_cast 來完成這個轉換,但這種方式存在一些問題。

使用 static_cast 進行枚舉到其底層類型的轉換,會使代碼的可讀性和可維護性變差。因為在代碼中,static_cast 看起來就像普通的類型轉換,很難快速識別出這是一個從強類型枚舉到其底層值的轉換。而且,當枚舉類型的底層類型發生變化時(例如從有符號類型變為無符號類型),使用 static_cast 的代碼可能會出現潛在的錯誤。而 std::to_underlying 的出現,正是為了解決這些問題,它提供了一種更安全、更清晰的方式來獲取枚舉的底層值。

使用示例

下面通過幾個具體的示例來展示 std::to_underlying 的使用方法。

#include <cstdint>
#include <iomanip>
#include <iostream>
#include <type_traits>
#include <utility>// 示例 1:不同枚舉類型的底層類型驗證
enum class E1 : char { e };
static_assert(std::is_same_v<char, decltype(std::to_underlying(E1::e))>);enum struct E2 : long { e };
static_assert(std::is_same_v<long, decltype(std::to_underlying(E2::e))>);enum E3 : unsigned { e };
static_assert(std::is_same_v<unsigned, decltype(std::to_underlying(E3::e))>);// 示例 2:實際輸出枚舉的底層值
int main()
{enum class ColorMask : std::uint32_t{red = 0xFF, green = (red << 8), blue = (green << 8), alpha = (blue << 8)};std::cout << std::hex << std::uppercase << std::setfill('0')<< std::setw(8) << std::to_underlying(ColorMask::red) << '\n'<< std::setw(8) << std::to_underlying(ColorMask::green) << '\n'<< std::setw(8) << std::to_underlying(ColorMask::blue) << '\n'<< std::setw(8) << std::to_underlying(ColorMask::alpha) << '\n';// 編譯錯誤示例,不能直接將枚舉賦值給底層類型變量// std::underlying_type_t<ColorMask> x = ColorMask::alpha; // 正確示例,使用 std::to_underlying 進行轉換[[maybe_unused]]std::underlying_type_t<ColorMask> y = std::to_underlying(ColorMask::alpha); return 0;
}

在上述代碼中,示例 1 通過 static_assert 驗證了不同枚舉類型使用 std::to_underlying 轉換后的底層類型是否正確。示例 2 則實際輸出了 ColorMask 枚舉的各個值的底層類型,并且展示了直接將枚舉賦值給底層類型變量會導致編譯錯誤,而使用 std::to_underlying 則可以正確進行轉換。

與之前方法的對比

std::to_underlying 出現之前,開發者通常會使用 static_cast 來將枚舉轉換為其底層類型。例如:

enum class MyEnum : int { Value1, Value2 };
int underlyingValue = static_cast<int>(MyEnum::Value1);

這種方式雖然可以實現功能,但存在一些缺點。首先,代碼的可讀性較差,從 static_cast 的使用中很難一眼看出這是在進行枚舉到其底層類型的轉換。其次,當枚舉的底層類型發生變化時,需要手動修改 static_cast 中的目標類型,否則可能會導致潛在的錯誤。

而使用 std::to_underlying 則可以避免這些問題。std::to_underlying 明確地表示了這是一個將枚舉轉換為其底層類型的操作,提高了代碼的可讀性。并且,無論枚舉的底層類型如何變化,std::to_underlying 都能正確工作,無需手動修改代碼。例如:

enum class MyEnum : int { Value1, Value2 };
int underlyingValue = std::to_underlying(MyEnum::Value1);

即使 MyEnum 的底層類型從 int 變為其他類型,上述代碼仍然可以正常工作。

在 C++23 中的意義

std::to_underlying 的引入是 C++ 語言不斷發展和完善的體現。它符合現代 C++ 注重代碼安全性、可讀性和可維護性的設計理念。在 C++23 中,std::to_underlying 作為標準庫的一部分,為開發者提供了一個統一、規范的方式來處理枚舉到其底層類型的轉換。

隨著 C++ 標準的不斷演進,枚舉類型在 C++ 中的應用也越來越廣泛。從 C++11 引入的枚舉類(enum class)解決了傳統枚舉的命名沖突和隱式轉換問題,到 C++17 允許使用大括號初始化基礎類型,再到 C++20 引入的 using enum 語法,枚舉類型的功能不斷得到增強。而 std::to_underlying 的出現,進一步完善了枚舉類型的使用場景,使得開發者在處理枚舉時更加方便和安全。

總結

std::to_underlying 是 C++23 為開發者帶來的一個實用工具函數,它為獲取枚舉的底層值提供了一種更安全、更清晰的方式。通過使用 std::to_underlying,可以提高代碼的可讀性和可維護性,避免因枚舉底層類型變化而帶來的潛在錯誤。在實際開發中,當需要將枚舉轉換為其底層類型時,建議優先使用 std::to_underlying。相信隨著 C++23 的逐漸普及,std::to_underlying 會在更多的項目中得到廣泛應用。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/78389.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/78389.shtml
英文地址,請注明出處:http://en.pswp.cn/web/78389.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

WGDI-分析WGD及祖先核型演化的集成工具-文獻精讀126

WGDI: A user-friendly toolkit for evolutionary analyses of whole-genome duplications and ancestral karyotypes WGDI&#xff1a;一款面向全基因組重復事件與祖先核型演化分析的易用工具集 摘要 在地球上大多數主要生物類群中&#xff0c;人們已檢測到全基因組復制&…

C# 方法(控制流和方法調用)

本章內容: 方法的結構 方法體內部的代碼執行 局部變量 局部常量 控制流 方法調用 返回值 返回語句和void方法 局部函數 參數 值參數 引用參數 引用類型作為值參數和引用參數 輸出參數 參數數組 參數類型總結 方法重載 命名參數 可選參數 棧幀 遞歸 控制流 方法包含了組成程序的…

「Mac暢玩AIGC與多模態16」開發篇12 - 多節點串聯與輸出合并的工作流示例

一、概述 本篇在輸入變量與單節點執行的基礎上,擴展實現多節點串聯與格式化合并輸出的工作流應用。開發人員將掌握如何在 Dify 工作流中統一管理輸入變量,通過多節點串聯引用,生成規范統一的最終輸出,為后續構建復雜邏輯流程打下基礎。 二、環境準備 macOS 系統Dify 平臺…

解鎖Windows異步黑科技:IOCP從入門到精通

在當今快節奏的數字化時代&#xff0c;軟件應用對性能的追求可謂永無止境。無論是高并發的網絡服務器&#xff0c;還是需要快速處理大量文件的桌面應用&#xff0c;都面臨著一個共同的挑戰&#xff1a;如何在有限的系統資源下&#xff0c;實現高效的數據輸入輸出&#xff08;I/…

Java學習手冊:Spring 生態其他組件介紹

一、微服務架構相關組件 Spring Cloud 服務注冊與發現 &#xff1a; Eureka &#xff1a;由 Netflix 開源&#xff0c;包含 Eureka Server 和 Eureka Client 兩部分。Eureka Server 作為服務注冊表&#xff0c;接收服務實例的注冊請求并管理其信息&#xff1b;Eureka Client 負…

VMware Workstation 創建虛擬機并安裝 Ubuntu 系統 的詳細步驟指南

VMware Workstation 創建虛擬機并安裝 Ubuntu 系統 的詳細步驟指南 一、準備工作1. 下載 Ubuntu 鏡像2. 安裝 VMware Workstation 二、創建虛擬機1. 新建虛擬機向導2. 選擇虛擬機配置類型3. 加載安裝鏡像4. 系統類型配置5. 虛擬機命名與存儲6. 磁盤容量分配7. 硬件自定義&#…

串口的緩存發送以及緩存接收機制

#創作靈感# 在我們實際使用MCU進行多串口任務分配的時候&#xff0c;我們會碰到這樣一種情況&#xff0c;即串口需要短間隔周期性發送數據&#xff0c;且相鄰兩幀之間需要間隔一段時間&#xff0c;防止連幀。我們常常需要在軟件層面對串口的發送和接受做一個緩存的處理方式。 …

時間交織(TIADC)的失配誤差校正處理(以4片1GSPS采樣率的12bitADC交織為例講解)

待寫…有空再寫&#xff0c;有需要的留言。 存在失配誤差的4GSPS交織 校正完成后的4GSPS交織

Linux進程間通信(二)之管道1【匿名管道】

文章目錄 管道什么是管道匿名管道用fork來共享管道原理站在文件描述符角度-深度理解管道站在內核角度-管道本質 接口實例代碼管道特點管道的4種情況管道讀寫規則應用場景 管道 什么是管道 管道是Unix中最古老的進程間通信的形式。 我們把從一個進程連接到另一個進程的一個數…

Xilinx FPGA | 管腳約束 / 時序約束 / 問題解析

注&#xff1a;本文為 “Xilinx FPGA | 管腳約束 / 時序約束 / 問題解析” 相關文章合輯。 略作重排&#xff0c;未整理去重。 如有內容異常&#xff0c;請看原文。 Xilinx FPGA 管腳 XDC 約束之&#xff1a;物理約束 FPGA技術實戰 于 2020-02-04 17:14:53 發布 說明&#x…

家用服務器 Ubuntu 服務器配置與 Cloudflare Tunnel 部署指南

Ubuntu 服務器配置與 Cloudflare Tunnel 部署指南 本文檔總結了我們討論的所有內容&#xff0c;包括 Ubuntu 服務器配置、硬盤擴容、靜態 IP 設置以及 Cloudflare Tunnel 的部署步驟。 目錄 硬盤分區與擴容設置靜態 IPCloudflare Tunnel 部署SSH 通過 Cloudflare Tunnel常見…

分享5款開源、美觀的 WinForm UI 控件庫

前言 今天大姚給大家分享5款開源、美觀的 WinForm UI 控件庫&#xff0c;助力讓我們的 WinForm 應用更好看。 WinForm WinForm是一個傳統的桌面應用程序框架&#xff0c;它基于 Windows 操作系統的原生控件和窗體。通過簡單易用的 API&#xff0c;開發者可以快速構建基于窗體…

PHP盲盒商城系統源碼從零搭建部署:專業級開發與優化實踐

【導語&#xff1a;技術驅動商業創新】 在2025年社交電商全面升級的浪潮下&#xff0c;基于PHP的盲盒系統憑借其高開發效率與低成本優勢&#xff0c;成為中小企業的首選方案。本文將深度拆解盲盒源碼從開發到部署的全流程技術細節&#xff0c;涵蓋架構設計、性能優化與安全防護…

(33)VTK C++開發示例 ---圖片轉3D

文章目錄 1. 概述2. CMake鏈接VTK3. main.cpp文件4. 演示效果 更多精彩內容&#x1f449;內容導航 &#x1f448;&#x1f449;VTK開發 &#x1f448; 1. 概述 這是 VTK 測試 clipArt.tcl 的改編版本。 提供帶有 2D 剪貼畫的 jpg 文件&#xff0c;該示例將創建 3D 多邊形數據模…

2025東三省B題深圳杯B題數學建模挑戰賽數模思路代碼文章教學

完整內容請看文章最下面的推廣群 已經完成全部問題的代碼和建模 一、問題一的模型構建與優化&#xff08;RGB顏色空間轉換模型&#xff09; 基礎模型&#xff08;線性映射模型&#xff09;/高斯過程回歸模型&#xff08;GPR&#xff09;&#xff1a; 針對高清視頻源&#xff0…

linux netlink實現用戶態和內核態數據交互

1&#xff0c;內核態代碼 #include <linux/module.h> #include <linux/netlink.h> #include <net/sock.h> #define NETLINK_TEST 31 struct sock *nl_sk NULL; static void nl_recv_msg(struct sk_buff *skb) { struct nlmsghdr *nlh; int pid; …

LeetCode:DP-多狀態問題

簡單 面試題 17.16. 按摩師 一個有名的按摩師會收到源源不斷的預約請求&#xff0c;每個預約都可以選擇接或不接。在每次預約服務之間要有休息時間&#xff0c;因此她不能接受相鄰的預約。給定一個預約請求序列&#xff0c;替按摩師找到最優的預約集合&#xff08;總預約時間最…

Spring AOP---面向切面編程由認識到使用

1. AOP AOP(Aspect-Oriented Programming), 是一種思想, 面向切面編程。 在前文統一異常處理&#xff0c;統一結果返回就是使用了這一思想&#xff08;都是在集中處理某一類事情, 但又不影響原有代碼的正常運行&#xff09;&#xff0c;但他們不是AOP&#xff0c;只是應用了這…

專題二十四:虛擬專用網絡

一、VPN簡介 VPN&#xff08;Virtual Personal Network&#xff09;即虛擬專用網&#xff0c;泛指通過VPN技術在公用網絡上構建的虛擬專用網絡。VPN用戶在此虛擬網絡中傳輸私網流量&#xff0c;在不改變網絡現狀的情況下實現安全、可靠的連接。其主要功能是在公用網絡上建立專…

Milvus(12):分析器

1 分析器概述 在文本處理中&#xff0c;分析器是將原始文本轉換為結構化可搜索格式的關鍵組件。每個分析器通常由兩個核心部件組成&#xff1a;標記器和過濾器。它們共同將輸入文本轉換為標記&#xff0c;完善這些標記&#xff0c;并為高效索引和檢索做好準備。 在 Milvus 中&a…