後設程式庫 (自 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) |
檢查型別是否為 union 型別 (類別模板) |
| (C++11) |
檢查型別是否為非 union 的類別型別 (類別模板) |
| (C++11) |
檢查型別是否為函式型別 (類別模板) |
| (C++11) |
檢查型別是否為指標型別 (類別模板) |
| (C++11) |
檢查型別是否為左值參照 (lvalue reference) (類別模板) |
| (C++11) |
檢查型別是否為右值參照 (rvalue reference) (類別模板) |
| (C++11) |
檢查型別是否為非靜態成員物件指標 (類別模板) |
| (C++11) |
檢查型別是否為非靜態成員函式指標 (類別模板) |
複合型別分類 | |
| 定義於標頭檔
<type_traits> | |
| (C++11) |
檢查型別是否為基本型別 (fundamental type) (類別模板) |
| (C++11) |
檢查型別是否為算術型別 (類別模板) |
| (C++11) |
檢查型別是否為標量型別 (scalar type) (類別模板) |
| (C++11) |
檢查型別是否為物件型別 (類別模板) |
| (C++11) |
檢查型別是否為複合型別 (類別模板) |
| (C++11) |
檢查型別是否為左值參照或右值參照 (類別模板) |
| (C++11) |
檢查型別是否為指向非靜態成員函式或物件的指標 (類別模板) |
類型屬性 | |
| 定義於標頭檔
<type_traits> | |
| (C++11) |
檢查型別是否具有 const 限定修飾 (類別模板) |
| (C++11) |
檢查型別是否具有 volatile 限定修飾 (類別模板) |
| (C++11)(於 C++26 中廢棄) |
檢查型別是否為瑣碎 (trivial) 型別 (類別模板) |
| (C++11) |
檢查型別是否為瑣碎可複製 (trivially copyable) 型別 (類別模板) |
| (C++11) |
檢查型別是否為 標準佈局 (standard-layout) 型別 (類別模板) |
| (C++11)(於 C++20 中廢棄) |
檢查型別是否為平衡舊資料 (POD) 型別 (類別模板) |
| (C++11)(於 C++17 中棄用)(於 C++20 中移除) |
檢查型別是否為字面量 (literal) 型別 (類別模板) |
| 檢查類型物件表示中的每個位元是否都對其值有所貢獻 (類別模板) | |
| (C++11) |
檢查型別是否為類別 (但非 union) 且沒有非靜態資料成員 (類別模板) |
| (C++11) |
檢查型別是否為多型 (polymorphic) 類別型別 (類別模板) |
| (C++11) |
檢查型別是否為抽象類別型別 (類別模板) |
| (C++14) |
檢查型別是否為 final 類別型別 (類別模板) |
| (C++17) |
檢查型別是否為聚合 (aggregate) 型別 (類別模板) |
| (C++23) |
檢查類型是否為隱式生命週期類型 (類別模板) |
| (C++11) |
檢查型別是否為有正負號的算術型別 (類別模板) |
| (C++11) |
檢查型別是否為無正負號的算術型別 (類別模板) |
| (C++20) |
檢查型別是否為已知邊界的陣列型別 (類別模板) |
| (C++20) |
檢查型別是否為未知邊界的陣列型別 (類別模板) |
| (C++23) |
檢查型別是否為有作用域的列舉 (scoped enumeration) 型別 (類別模板) |
支援的操作 | |
| 定義於標頭檔
<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) |
檢查型別是否具有未刪除 (non-deleted) 的解構子 (類別模板) |
| (C++11) |
檢查型別是否具有虛擬解構子 (類別模板) |
| (C++17)(C++17)(C++17)(C++17) |
檢查某型別的物件是否可以與相同或不同型別的物件交換 (類別模板) |
| 檢查在直接初始化中,參考是否綁定到暫時性物件 (類別模板) | |
| 檢查在複製初始化中,參考是否綁定到暫時性物件 (類別模板) | |
[編輯] 屬性查詢
屬性查詢特性可用於在編譯期查詢類型的整數屬性。
所有這些類型特性都滿足 UnaryTypeTrait,每個類型特性的基本特性是 std::integral_constant<std::size_t, Value>,其中 Value 是相應屬性的查詢結果。
| 定義於標頭檔
<type_traits> | |
| (C++11) |
獲取型別的對齊 (alignment) 要求 (類別模板) |
| (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) |
檢查兩個型別是否為 佈局相容 (layout-compatible) (類別模板) |
| 檢查一個型別是否為另一個型別的 指標可互換 (pointer-interconvertible) (初始) 基底類別 (類別模板) | |
| 檢查一個型別是否可以使用給定的參數型別進行呼叫 (如同經由 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) |
從給定陣列型別移除一個維度 (extent) (類別模板) |
| (C++11) |
從給定陣列型別移除所有維度 (extents) (類別模板) |
指標 | |
| 定義於標頭檔
<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) |
決定一組型別中的共同型別 (common type) (類別模板) |
| 決定一組型別中的共同參照型別 (common reference type) (類別模板) | |
| (C++11) |
獲取給定列舉型別的底層整數型別 (類別模板) |
| (C++11)(於 C++20 中移除)(C++17) |
推導使用一組參數呼叫可呼叫物件時的結果型別 (類別模板) |
| (C++17) |
void 變長參數別名模板 (別名模板) |
| (C++20) |
原封不動地傳回型別參數 (類別模板) |
[編輯] 邏輯運算 (自 C++17 起)
邏輯運算子特性將邏輯運算子應用於其他類型特性。
| 定義於標頭檔
<type_traits> | |
| (C++17) |
變長參數邏輯「與」(AND) 元函式 (類別模板) |
| (C++17) |
變長參數邏輯「或」(OR) 元函式 (類別模板) |
| (C++17) |
邏輯「非」(NOT) 元函式 (類別模板) |
[編輯] 成員關係 (自 C++20 起)
| 定義於標頭檔
<type_traits> | |
| 檢查某型別的物件與該型別指定的子物件是否為 指標可互換 (pointer-interconvertible) (函式模板) | |
| (C++20) |
檢查兩個指定成員是否在兩個指定類型的共同初始子序列中相互對應 (函式模板) |
[編輯] 編譯期有理數運算
標頭檔 <ratio> 提供了用於操作和儲存編譯期比率的類型和函式。
[編輯] 編譯期整數序列 (自 C++14 起)
| 定義於標頭檔
<utility> | |
| (C++14) |
實作編譯期整數序列 (類別模板) |