<type_traits>
定義編譯時間常數的範本,以提供其類型自變數屬性的相關信息,或產生轉換的類型。
語法
#include <type_traits>
備註
>type_traits中的<類別和範本可用來支援編譯時期的類型推斷、分類和轉換。 它們也可用來偵測類型相關的錯誤,並協助您優化一般程式代碼。 一元類型特性描述類型的屬性、二進位類型特性描述類型之間的關聯性,以及轉換特性會修改類型的屬性。
協助程式類別 integral_constant
及其範本特製化 true_type
,並 false_type
形成類型述詞的基類。 「類型述詞」是採用一或兩個類型引數的範本。 當類型述 詞保留 true 時,它會直接或間接衍生自 true_type。 當類型述 詞保留 false 時,它會直接或間接衍生自 false_type。
類型修飾詞或轉換特性是採用一或多個範本引數的範本,且具有一個成員 type
,這是已修改類型的同義字。
別名範本
為了簡化類型特性表達式,會提供的typename some_trait<T>::type
別名範本,其中 some_trait 是類別範本名稱。 例如,add_const 具有其類型 add_const_t
的別名範本,定義為:
template <class T>
using add_const_t = typename add_const<T>::type;
這些是成員所提供的別名 type
:
add_const_t
add_cv_t
add_lvalue_reference_t
add_pointer_t
add_rvalue_reference_t
add_volatile_t
aligned_storage_t
aligned_union_t
\
common_type_t
conditional_t
decay_t
enable_if_t
invoke_result_t
make_signed_t
make_unsigned_t
remove_all_extents_t
\
remove_const_t
remove_cv_t
remove_extent_t
remove_pointer_t
remove_reference_t
remove_volatile_t
result_of_t
underlying_type_t
\
類別
Helper 類別和 typedef
名稱 | 描述 |
---|---|
integral_constant | 從類型及值建立整數常數。 |
true_type | 存有具有 True 值的整數常數。 |
false_type | 存有具有 False 值的整數常數。 |
主要的類型類別
名稱 | 描述 |
---|---|
is_void | 測試類型是否為 void 。 |
is_null_pointer | 測試類型是否為 std::nullptr_t 。 |
is_integral | 測試類型是否為整數。 |
is_floating_point | 測試類型是否為浮點。 |
is_array | 測試類型是否為陣列。 |
is_pointer | 測試類型是否為指標。 |
is_lvalue_reference | 測試類型是否為 lvalue 參考。 |
is_rvalue_reference | 測試類型是否為 rvalue 參考。 |
is_member_object_pointer | 測試類型是否為成員物件的指標。 |
is_member_function_pointer | 測試類型是否為成員函式的指標。 |
is_enum | 測試類型是否為列舉。 |
is_union | 測試類型是否為等位。 |
is_class | 測試類型是否為類別。 |
is_function | 測試類型是否為函式類型。 |
複合類型類別
名稱 | 描述 |
---|---|
is_reference | 測試類型是否為參考。 |
is_arithmetic | 測試類型是否為算術。 |
is_fundamental | 測試類型是否為 void 或算術。 |
is_object | 測試類型是否為物件類型。 |
is_scalar | 測試類型是否為純量。 |
is_compound | 測試類型是否不是純量。 |
is_member_pointer | 測試類型是否為成員的指標。 |
類型屬性
名稱 | 描述 |
---|---|
is_const | 測試類型是否為 const 。 |
is_volatile | 測試類型是否為 volatile 。 |
is_trivial | 測試類型是否為 trivial。 |
is_trivially_copyable | 測試類型是否可完整複製。 |
is_standard_layout | 測試類型是否為標準配置類型。 |
is_pod | 測試類型是否為 POD。 |
is_literal_type | 測試類型是否可以是 constexpr 變數或用於 constexpr 函式。 |
is_empty | 測試類型是否為空的類別。 |
is_polymorphic | 測試類型是否為多型類別。 |
is_abstract | 測試類型是否有抽象類別。 |
is_final | 測試類型是否為標示 final 的類別類型。 |
is_aggregate | |
is_signed | 測試類型是否為有正負號整數。 |
is_unsigned | 測試類型是否為無正負號整數。 |
is_constructible | 測試類型是否可使用指定的引數類型建構。 |
is_default_constructible | 測試類型是否有預設建構函式。 |
is_copy_constructible | 測試類型是否有複製建構函式。 |
is_move_constructible | 測試類型是否具有移動建構函式。 |
is_assignable | 測試第一個類型是否可以指派第二個類型的值。 |
is_copy_assignable | 測試類型是否可指派類型的常數參考值。 |
is_move_assignable | 測試類型是否可指派類型的右值參考。 |
is_swappable | |
is_swappable_with | |
is_destructible | 測試類型是否為易損壞的。 |
is_trivially_constructible | 測試類型在使用指定的類型建構時是否不使用任何非 trivial 作業。 |
is_trivially_default_constructible | 測試類型在預設建構時是否不使用任何非 trivial 作業。 |
is_trivially_copy_constructible | 測試類型在複製建構時是否不使用任何非 trivial 作業。 |
is_trivially_move_constructible | 測試類型在移動建構時是否不使用任何非 trivial 作業。 |
is_trivially_assignable | 測試類型是否可指派,且指派不使用任何非 trivial 作業。 |
is_trivially_copy_assignable | 測試類型是否可指派複製,且指派不使用任何非 trivial 作業。 |
is_trivially_move_assignable | 測試類型是否可指派移動,且指派不使用任何非 trivial 作業。 |
is_trivially_destructible | 測試類型是否可破壞,且解構函式不使用任何非 trivial 作業。 |
is_nothrow_constructible | 測試類型是否可建構,且已知在使用指定的類型建構時不會擲回。 |
is_nothrow_default_constructible | 測試類型是否可預設建構,且已知在預設建構時不會擲回。 |
is_nothrow_copy_constructible | 測試類型是否可複製建構,且已知複製建構函式不會擲回。 |
is_nothrow_move_constructible | 測試類型是否可移動建構,且已知移動建構函式不會擲回。 |
is_nothrow_assignable | 測試類型是否可使用指定類型指派,且已知指派不會擲回。 |
is_nothrow_copy_assignable | 測試類型是否可指派複製,且已知指派不會擲回。 |
is_nothrow_move_assignable | 測試類型是否可指派移動,且已知指派不會擲回。 |
is_nothrow_swappable | |
is_nothrow_swappable_with | |
is_nothrow_destructible | 測試類型是否可破壞,且已知解構函式不會擲回。 |
has_virtual_destructor |
測試類型是否有虛擬解構函式。 |
has_unique_object_representations |
|
is_invocable | 測試是否可以使用指定的自變數類型來叫用可呼叫的類型。 已在 C++17 中新增。 |
is_invocable_r | 測試是否可以使用指定的自變數類型叫用可呼叫的類型,而且結果可轉換成指定的型別。 已在 C++17 中新增。 |
is_nothrow_invocable | 測試是否可以使用指定的自變數類型叫用可呼叫的類型,而且已知不會擲回例外狀況。 已在 C++17 中新增。 |
is_nothrow_invocable_r | 測試是否可以使用指定的自變數類型叫用可呼叫的類型,而且已知不會擲回例外狀況,而且結果可轉換成指定的型別。 已在 C++17 中新增。 |
類型屬性的查詢
名稱 | 描述 |
---|---|
alignment_of | 取得類型的對齊方式。 |
rank | 取得陣列維度的數目。 |
extent | 取得指定陣列維度中的項目數目。 |
類型關聯
名稱 | 描述 |
---|---|
is_same | 測試兩個類型是否一樣。 |
is_base_of | 測試某個類型是否為另一個類型的基底。 |
is_convertible | 測試某個類型是否可轉換為另一個類型。 |
常數 volatile 修改
名稱 | 描述 |
---|---|
add_const | 從類型產生 const 類型。 |
add_volatile | 從類型產生 volatile 類型。 |
add_cv | 從類型產生 const volatile 類型。 |
remove_const | 從類型產生非常數類型。 |
remove_volatile | 從類型產生非 volatile 類型。 |
remove_cv | 從類型產生非常數非 volatile 類型。 |
參考修改
名稱 | 描述 |
---|---|
add_lvalue_reference | 從類型產生類型的參考。 |
add_rvalue_reference | 從類型產生類型的右值參考 |
remove_reference | 從類型產生非參考類型。 |
簽章修改
名稱 | 描述 |
---|---|
make_signed | 如果已簽章或者最小已簽章類型的大小大於或等於類型,則產生類型。 |
make_unsigned | 如果未簽章或者最小未簽章類型的大小大於或等於類型,則產生類型。 |
陣列修改
名稱 | 描述 |
---|---|
remove_all_extents | 從陣列類型產生非陣列類型。 |
remove_extent | 從陣列類型產生項目類型。 |
指標修改
名稱 | 描述 |
---|---|
add_pointer | 從類型產生類型的指標。 |
remove_pointer | 從類型的指標產生類型。 |
其他轉換
名稱 | 描述 |
---|---|
aligned_storage | 為對齊類型配置未初始化的記憶體。 |
aligned_union | 使用非簡單式建構函式或解構函式為對齊的聯集配置未初始化的記憶體。 |
common_type | 產生參數封裝之所有類型的一般類型。 |
conditional | 如果條件為 true,則產生第一個指定的類型,反之則產生第二個指定的類型。 |
decay | 產生由值傳遞的類型。 建立非參考、非常數或非暫時性的類型,或建立類型的指標。 |
enable_if | 如果條件為 true,則產生指定的類型,反之則不產生類型。 |
invoke_result | 決定採用指定引數類型之可呼叫類型的傳回類型。 已在 C++17 中新增。 |
result_of | 決定採用指定引數類型之可呼叫類型的傳回類型。 已在 C++14 中新增,C++17 中已被取代。 |
underlying_type | 產生列舉類型的基礎整數類型。 |
邏輯運算子特性
名稱 | 描述 |
---|---|
連接 | |
分離 | |
否定 |