元编程库 (C++11 起)
C++ 提供元編程設施,諸如類型特徵、編譯時有理數算術,以及編譯時整數序列。
定義
以下類型統稱為可引用類型:
對於任何可引用類型 T,都可以創建到它的引用[1]。
類型特徵
類型特徵定義基於模板的編譯時接口,用以查詢類型的屬性。
試圖特化在標頭 <type_traits> 定義且在本頁列出的模板會導致未定義行為,但可以按描述要求特化 std::common_type 和 std::basic_common_reference(C++20 起)。
除非另有說明,標頭 <type_traits> 定義的模板都可以用不完整類型實例化,儘管以不完整類型實例化標準庫模板通常是禁止的。
基類
大部分非變換類型特徵需要無歧義地公開繼承 std::integral_constant,以滿足一元類型特徵 (UnaryTypeTrait) 或二元類型特徵 (BinaryTypeTrait) 。
在標頭
<type_traits> 定義 | |
(C++11)(C++17) |
具有指定值的指定類型的編譯期常量 (類模板) |
標準提供 std::integral_constant 對類型 bool 的兩個特化:
在標頭
<type_traits> 定義 | |
| 類型 | 定義 |
true_type
|
std::integral_constant<bool, true>
|
false_type
|
std::integral_constant<bool, false>
|
一元類型特徵
一元類型特徵可以用於在編譯時查詢類型的布爾屬性。
所有這些類型特徵都滿足一元類型特徵 (UnaryTypeTrait) ,每個類型特徵的基特徵都是 std::true_type 和 std::false_type 之一,取決於是否符合對應的條件。
基礎類型類別 | |
在標頭
<type_traits> 定義 | |
(C++11) |
檢查類型是否為 void (類模板) |
(C++11)(DR*) |
檢查類型是否為 std::nullptr_t (類模板) |
(C++11) |
檢查類型是否為整數類型 (類模板) |
(C++11) |
檢查類型是否為浮點數類型 (類模板) |
(C++11) |
檢查類型是否為數組類型 (類模板) |
(C++11) |
檢查類型是否為枚舉類型 (類模板) |
(C++11) |
檢查類型是否為聯合體類型 (類模板) |
(C++11) |
檢查類型是否為非聯合類類型 (類模板) |
(C++11) |
檢查類型是否為函數類型 (類模板) |
(C++11) |
檢查類型是否為指針類型 (類模板) |
(C++11) |
檢查類型是否為左值引用 (類模板) |
(C++11) |
檢查類型是否為右值引用 (類模板) |
(C++11) |
檢查類型是否為指向非靜態成員對象的指針 (類模板) |
(C++11) |
檢查類型是否為指向非靜態成員函數的指針 (類模板) |
複合類型類別 | |
在標頭
<type_traits> 定義 | |
(C++11) |
檢查類型是否為基礎類型 (類模板) |
(C++11) |
檢查類型是否為算術類型 (類模板) |
(C++11) |
檢查類型是否為標量類型 (類模板) |
(C++11) |
檢查類型是否為對象類型 (類模板) |
(C++11) |
檢查類型是否為複合類型 (類模板) |
(C++11) |
檢查類型是否為左值引用 或右值引用 (類模板) |
(C++11) |
檢查類型是否為指向非靜態成員函數或對象的指針類型 (類模板) |
類型屬性 | |
在標頭
<type_traits> 定義 | |
(C++11) |
檢查類型��否為 const 限定 (類模板) |
(C++11) |
檢查類型是否為 volatile 限定 (類模板) |
(C++11)(C++26 棄用) |
檢查類型是否平凡 (類模板) |
(C++11) |
檢查類型是否可平凡複製 (類模板) |
(C++11) |
檢查類型是否為標準布局類型 (類模板) |
(C++11)(C++20 棄用) |
檢查類型是否為簡舊數據(POD)類型 (類模板) |
(C++11)(C++17 棄用)(C++20 移除) |
檢查類型是否為字面類型 (類模板) |
| 檢查是否該類型對象的每一位都對其值有貢獻 (類模板) | |
(C++11) |
檢查類型是否為類(但非聯合體)類型且無非靜態數據成員 (類模板) |
(C++11) |
檢查類型是否為多態類類型 (類模板) |
(C++11) |
檢查類型是否為抽象類類型 (類模板) |
(C++14) |
檢查類型是否為 final 類類型 (類模板) |
(C++17) |
檢查類型是否為聚合類型 (類模板) |
(C++23) |
檢查類型是否為隱式生存期類型 (類模板) |
(C++11) |
檢查類型是否為有符號算術類型 (類模板) |
(C++11) |
檢查類型是否為無符號算術類型 (類模板) |
(C++20) |
檢查類型是否為有已知邊界的數組類型 (類模板) |
(C++20) |
檢查類型是否為有未知邊界的數組類型 (類模板) |
(C++23) |
檢查類型是否為有作用域枚舉類型 (類模板) |
受支持操作 | |
在標頭
<type_traits> 定義 | |
(C++11)(C++11)(C++11) |
檢查類型是否帶有針對特定實參的構造函數 (類模板) |
| 檢查類型是否有默認構造函數 (類模板) | |
(C++11)(C++11)(C++11) |
檢查類型是否有複製構造函數 (類模板) |
(C++11)(C++11)(C++11) |
檢查類型是否能從右值引用構造 (類模板) |
(C++11)(C++11)(C++11) |
檢查類型是否有針對特定實參的賦值運算符 (類模板) |
(C++11)(C++11)(C++11) |
檢查類型是否有複製賦值運算符 (類模板) |
(C++11)(C++11)(C++11) |
檢查類型是否有移動賦值運算符 (類模板) |
(C++11)(C++11)(C++11) |
檢查類型是否有未被棄置的析構函數 (類模板) |
(C++11) |
檢查類型是否有虛析構函數 (類模板) |
(C++17)(C++17)(C++17)(C++17) |
檢查類型的對象是否能與同類型或不同類型的對象交換 (類模板) |
| 檢查在直接初始化中引用是否綁定到臨時對象 (類模板) | |
| 檢查在複製初始化中引用是否綁定到臨時對象 (類模板) | |
屬性查詢
屬性查詢特徵可以用於在編譯時查詢類型的整數屬性。
所有這些類型特徵都滿足一元類型特徵 (UnaryTypeTrait) ,每個類型特徵的基特徵都是 std::integral_constant<std::size_t, Value>,其中 Value 是對應屬性的查詢結果。
在標頭
<type_traits> 定義 | |
(C++11) |
獲取類型的對齊要求 (類模板) |
(C++11) |
獲取數組類型的維數 (類模板) |
(C++11) |
獲取數組類型在指定維數的大小 (類模板) |
類型關係
類型關係特徵可以用於在編譯時查詢類型之間的關係。
所有這些類型特徵都滿足二元類型特徵 (BinaryTypeTrait) ,每個類型特徵的基特徵都是 std::true_type 和 std::false_type 之一,取決於是否符合對應的條件。
在標頭
<type_traits> 定義 | |
(C++11) |
檢查兩個類型是否相同 (類模板) |
(C++11) |
檢查一個類型是否為另一個類型的基類 (類模板) |
(C++26) |
檢查一個類型是否為另一個類型的虛基類 (類模板) |
(C++11)(C++20) |
檢查是否能轉換一個類型為另一類型 (類模板) |
(C++20) |
檢查兩個類型是否布局兼容 (類模板) |
| 檢查一個類型是否為另一類型的指針可以互相轉換(起始)基類 (類模板) | |
| 檢查類型能否以給定的實參類型調用(如同以 std::invoke) (類模板) | |
類型變換
類型變換特徵按照預定義對著將一個類型變換到另一個。
所有這些類型特徵都滿足變換特徵 (TransformationTrait) 。
常性/易變性說明符 | |
在標頭
<type_traits> 定義 | |
(C++11)(C++11)(C++11) |
從給定類型移除 const 和/或 volatile 限定符 (類模板) |
(C++11)(C++11)(C++11) |
向給定類型添加 const 和/或 volatile 限定符 (類模板) |
引用 | |
在標頭
<type_traits> 定義 | |
(C++11) |
從給定類型移除引用 (類模板) |
(C++11)(C++11) |
向給定類型添加左值 或右值 引用 (類模板) |
符號修飾符 | |
在標頭
<type_traits> 定義 | |
(C++11) |
獲取整數類型的對應有符號類型 (類模板) |
(C++11) |
獲取整數類型的對應無符號類型 (類模板) |
數組 | |
在標頭
<type_traits> 定義 | |
(C++11) |
從給定數組類型移除一個維度 (類模板) |
(C++11) |
從給定數組類型移除所有維度 (類模板) |
指針 | |
在標頭
<type_traits> 定義 | |
(C++11) |
從給定類型移除一層指針 (類模板) |
(C++11) |
向給定類型添加一層指針 (類模板) |
其他變換 | |
在標頭
<type_traits> 定義 | |
(C++11 起)(C++23 棄用) |
定義適於用作給定大小的類型的未初始化存儲的類型 (類模板) |
(C++11 起)(C++23 棄用) |
定義適於用作所有給定類型的未初始化存儲的類型 (類模板) |
(C++11) |
應用當按值傳遞��參給函數時所進行的類型變換 (類模板) |
(C++20) |
將 std::remove_cv 與 std::remove_reference 結合 (類模板) |
(C++11) |
條件性地從重載決議移除函數重載或模板特化 (類模板) |
(C++11) |
基於編譯時布爾值選擇一個類型或另一個 (類模板) |
(C++11) |
確定一組類型的公共類型 (類模板) |
| 確定一組類型的公共引用類型 (類模板) | |
(C++11) |
獲得給定枚舉類型的底層整數類型 (類模板) |
(C++11)(C++20 移除)(C++17) |
推導以一組實參調用一個可調用對象的結果類型 (類模板) |
(C++17) |
void 變參別名模板 (別名模板) |
(C++20) |
返回不更改的類型實參 (類模板) |
邏輯運算 (C++17 起)
邏輯運算符特徵將邏輯運算符應用到其他類型特徵上。
在標頭
<type_traits> 定義 | |
(C++17) |
變參的邏輯與元函數 (類模板) |
(C++17) |
變參的邏輯或元函數 (類模板) |
(C++17) |
邏輯非元函數 (類模板) |
成員關係 (C++17 起)
在標頭
<type_traits> 定義 | |
| 檢查一個類型的對象是否與該類型的指定子對象指針可以互相轉換 (函數模板) | |
(C++20) |
檢查兩個指定成員是否在兩個指定類型中的公共起始序列中彼此對應 (函數模板) |
編譯時有理數算術
標頭 <ratio> 提供操作和存儲編譯時比值的類型和函數。
編譯時整數序列 (C++14 起)
在標頭
<utility> 定義 | |
(C++14) |
實現編譯時整數數列 (類模板) |