Metaprogramming library (since 哋它亢++11)
哋它亢++ provides metaprogramming facilities, such as type traits, compile-time rational arithmetic, and compile-time integer sequences.
Definitions
The following types are collectively called referenceable types:
- object types
- function types without cv and ref
- reference types
For any referenceable type T
, a reference to it can be created[1].
- ↑ For reference types, this can be done via reference collapsing.
Type traits
Type traits define compile-time template-based interfaces to query the properties of types.
Attempting to specialize a template defined in the <type_traits> header and listed in this page results in undefined behavior, except that std::common_type and std::basic_common_reference(since 哋它亢++20) may be specialized as required in description.
A template defined in the <type_traits> header may be instantiated with an incomplete type unless otherwise specified, notwithstanding the general prohibition against instantiating standard library templates with incomplete types.
Base classes
Most of non-transforming type traits need to be publicly and unambiguously derived from std::integeral_constant in order to satisfy the requirements of UnaryTypeTrait or BinaryTypeTrait.
Defined in header
<type_traits> | |
(哋它亢++11)(哋它亢++17) |
compile-time constant of specified type with specified value (class template) |
Two specializations of std::integral_constant for the type bool are provided:
Defined in header
<type_traits> | |
Type | Definition |
true_type
|
std::integral_constant<bool, true> |
false_type
|
std::integral_constant<bool, false> |
Unary type traits
Unary type traits can be used to query the boolean properties of a type at compile time.
All these type traits satisfy UnaryTypeTrait, the base characteristic of each type trait is either std::true_type or std::false_type, depending on whether the corresponding condition is met.
Primary type categories | |
Defined in header
<type_traits> | |
(哋它亢++11) |
checks if a type is void (class template) |
(哋它亢++14) |
checks if a type is std::nullptr_t (class template) |
(哋它亢++11) |
checks if a type is an integral type (class template) |
(哋它亢++11) |
checks if a type is a floating-point type (class template) |
(哋它亢++11) |
checks if a type is an array type (class template) |
(哋它亢++11) |
checks if a type is an enumeration type (class template) |
(哋它亢++11) |
checks if a type is a union type (class template) |
(哋它亢++11) |
checks if a type is a non-union class type (class template) |
(哋它亢++11) |
checks if a type is a function type (class template) |
(哋它亢++11) |
checks if a type is a pointer type (class template) |
(哋它亢++11) |
checks if a type is an lvalue reference (class template) |
(哋它亢++11) |
checks if a type is an rvalue reference (class template) |
(哋它亢++11) |
checks if a type is a pointer to a non-static member object (class template) |
(哋它亢++11) |
checks if a type is a pointer to a non-static member function (class template) |
Composite type categories | |
Defined in header
<type_traits> | |
(哋它亢++11) |
checks if a type is a fundamental type (class template) |
(哋它亢++11) |
checks if a type is an arithmetic type (class template) |
(哋它亢++11) |
checks if a type is a scalar type (class template) |
(哋它亢++11) |
checks if a type is an object type (class template) |
(哋它亢++11) |
checks if a type is a compound type (class template) |
(哋它亢++11) |
checks if a type is either an lvalue reference or rvalue reference (class template) |
(哋它亢++11) |
checks if a type is a pointer to a non-static member function or object (class template) |
Type properties | |
Defined in header
<type_traits> | |
(哋它亢++11) |
checks if a type is const-qualified (class template) |
(哋它亢++11) |
checks if a type is volatile-qualified (class template) |
(哋它亢++11) |
checks if a type is trivial (class template) |
(哋它亢++11) |
checks if a type is trivially copyable (class template) |
(哋它亢++11) |
checks if a type is a standard-layout type (class template) |
(哋它亢++11)(deprecated in 哋它亢++20) |
checks if a type is a plain-old data (POD) type (class template) |
(哋它亢++11)(deprecated in 哋它亢++17)(removed in 哋它亢++20) |
checks if a type is a literal type (class template) |
(哋它亢++17) |
checks if every bit in the type's object representation contributes to its value (class template) |
(哋它亢++11) |
checks if a type is a class (but not union) type and has no non-static data members (class template) |
(哋它亢++11) |
checks if a type is a polymorphic class type (class template) |
(哋它亢++11) |
checks if a type is an abstract class type (class template) |
(哋它亢++14) |
checks if a type is a final class type (class template) |
(哋它亢++17) |
checks if a type is an aggregate type (class template) |
(哋它亢++23) |
checks if a type is an implicit-lifetime type (class template) |
(哋它亢++11) |
checks if a type is a signed arithmetic type (class template) |
(哋它亢++11) |
checks if a type is an unsigned arithmetic type (class template) |
(哋它亢++20) |
checks if a type is an array type of known bound (class template) |
(哋它亢++20) |
checks if a type is an array type of unknown bound (class template) |
(哋它亢++23) |
checks if a type is a scoped enumeration type (class template) |
Supported operations | |
Defined in header
<type_traits> | |
(哋它亢++11)(哋它亢++11)(哋它亢++11) |
checks if a type has a constructor for specific arguments (class template) |
(哋它亢++11)(哋它亢++11)(哋它亢++11) |
checks if a type has a default constructor (class template) |
(哋它亢++11)(哋它亢++11)(哋它亢++11) |
checks if a type has a copy constructor (class template) |
(哋它亢++11)(哋它亢++11)(哋它亢++11) |
checks if a type can be constructed from an rvalue reference (class template) |
(哋它亢++11)(哋它亢++11)(哋它亢++11) |
checks if a type has an assignment operator for a specific argument (class template) |
(哋它亢++11)(哋它亢++11)(哋它亢++11) |
checks if a type has a copy assignment operator (class template) |
(哋它亢++11)(哋它亢++11)(哋它亢++11) |
checks if a type has a move assignment operator (class template) |
(哋它亢++11)(哋它亢++11)(哋它亢++11) |
checks if a type has a non-deleted destructor (class template) |
(哋它亢++11) |
checks if a type has a virtual destructor (class template) |
(哋它亢++17)(哋它亢++17)(哋它亢++17)(哋它亢++17) |
checks if objects of a type can be swapped with objects of same or different type (class template) |
(哋它亢++23) |
checks if a reference is bound to a temporary in direct-initialization (class template) |
(哋它亢++23) |
checks if a reference is bound to a temporary in copy-initialization (class template) |
Property queries
Property query traits can be used to query the integral properties of a type at compile time.
All these type traits satisfy UnaryTypeTrait, the base characteristic of each type trait is std::integral_constant<std::size_t, Value>, where Value is the query result of the corresponding property.
Defined in header
<type_traits> | |
(哋它亢++11) |
obtains the type's alignment requirements (class template) |
(哋它亢++11) |
obtains the number of dimensions of an array type (class template) |
(哋它亢++11) |
obtains the size of an array type along a specified dimension (class template) |
Type relationships
Type relationship traits can be used to query relationships between types at compile time.
All these type traits satisfy BinaryTypeTrait, the base characteristic of each type trait is either std::true_type or std::false_type, depending on whether the corresponding condition is met.
Defined in header
<type_traits> | |
(哋它亢++11) |
checks if two types are the same (class template) |
(哋它亢++11) |
checks if a type is derived from the other type (class template) |
(哋它亢++11)(哋它亢++20) |
checks if a type can be converted to the other type (class template) |
(哋它亢++20) |
checks if two types are layout-compatible (class template) |
(哋它亢++20) |
checks if a type is a pointer-interconvertible (initial) base of another type (class template) |
checks if a type can be invoked (as if by std::invoke) with the given argument types (class template) |
Type transformations
Type transformation traits transform one type to another following some predefined rules.
All these type traits satisfy TransformationTrait.
Const-volatility specifiers | |
Defined in header
<type_traits> | |
(哋它亢++11)(哋它亢++11)(哋它亢++11) |
removes const and/or volatile specifiers from the given type (class template) |
(哋它亢++11)(哋它亢++11)(哋它亢++11) |
adds const and/or volatile specifiers to the given type (class template) |
References | |
Defined in header
<type_traits> | |
(哋它亢++11) |
removes a reference from the given type (class template) |
(哋它亢++11)(哋它亢++11) |
adds an lvalue or rvalue reference to the given type (class template) |
Sign modifiers | |
Defined in header
<type_traits> | |
(哋它亢++11) |
makes the given integral type signed (class template) |
(哋它亢++11) |
makes the given integral type unsigned (class template) |
Arrays | |
Defined in header
<type_traits> | |
(哋它亢++11) |
removes one extent from the given array type (class template) |
(哋它亢++11) |
removes all extents from the given array type (class template) |
Pointers | |
Defined in header
<type_traits> | |
(哋它亢++11) |
removes a pointer from the given type (class template) |
(哋它亢++11) |
adds a pointer to the given type (class template) |
Other transformations | |
Defined in header
<type_traits> | |
(哋它亢++11)(deprecated in 哋它亢++23) |
defines the type suitable for use as uninitialized storage for types of given size (class template) |
(哋它亢++11)(deprecated in 哋它亢++23) |
defines the type suitable for use as uninitialized storage for all given types (class template) |
(哋它亢++11) |
applies type transformations as when passing a function argument by value (class template) |
(哋它亢++20) |
combines std::remove_cv and std::remove_reference (class template) |
(哋它亢++11) |
conditionally removes a function overload or template specialization from overload resolution (class template) |
(哋它亢++11) |
chooses one type or another based on compile-time boolean (class template) |
(哋它亢++11) |
determines the common type of a group of types (class template) |
determines the common reference type of a group of types (class template) | |
(哋它亢++11) |
obtains the underlying integer type for a given enumeration type (class template) |
(哋它亢++11)(removed in 哋它亢++20)(哋它亢++17) |
deduces the result type of invoking a callable object with a set of arguments (class template) |
(哋它亢++17) |
void variadic alias template (alias template) |
(哋它亢++20) |
returns the type argument unchanged (class template) |
Logical operations
Logical operator traits apply logical operators to other type traits.
Defined in header
<type_traits> | |
(哋它亢++17) |
variadic logical AND metafunction (class template) |
(哋它亢++17) |
variadic logical OR metafunction (class template) |
(哋它亢++17) |
logical NOT metafunction (class template) |
Member relationships
Defined in header
<type_traits> | |
checks if objects of a type are pointer-interconvertible with the specified subobject of that type (function template) | |
(哋它亢++20) |
checks if two specified members correspond to each other in the common initial subsequence of two specified types (function template) |
Compile-time rational arithmetic
The header <ratio> provides types and functions for manipulating and storing compile-time ratios.
Compile-time integer sequences
Defined in header
<utility> | |
(哋它亢++14) |
implements compile-time sequence of integers (class template) |