Metaprogramming library
C++ provides metaprogramming facilities, such as type traits, compile-time rational arithmetic, and compile-time integer sequences.
The following types are collectively called referenceable types:
For any referenceable type T, a reference to it can be created[1].
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 C++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.
Most of non-transforming type traits need to be publicly and unambiguously derived from std::integral_constant in order to satisfy the requirements of UnaryTypeTrait or BinaryTypeTrait.
Two specializations of std::integral_constant for the type bool are provided:
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 | |
| (C++11) |
checks if a type is void (class template) [edit] |
| (C++11)(DR*) |
checks if a type is std::nullptr_t (class template) [edit] |
| (C++11) |
checks if a type is an integral type (class template) [edit] |
| (C++11) |
checks if a type is a floating-point type (class template) [edit] |
| (C++11) |
checks if a type is an array type (class template) [edit] |
| (C++11) |
checks if a type is an enumeration type (class template) [edit] |
| (C++11) |
checks if a type is a union type (class template) [edit] |
| (C++11) |
checks if a type is a non-union class type (class template) [edit] |
| (C++11) |
checks if a type is a function type (class template) [edit] |
| (C++11) |
checks if a type is a pointer type (class template) [edit] |
| (C++11) |
checks if a type is an lvalue reference (class template) [edit] |
| (C++11) |
checks if a type is an rvalue reference (class template) [edit] |
| (C++11) |
checks if a type is a non-static member object pointer (class template) [edit] |
| (C++11) |
checks if a type is a non-static member function pointer (class template) [edit] |
Composite type categories | |
| Defined in header | |
| (C++11) |
checks if a type is a fundamental type (class template) [edit] |
| (C++11) |
checks if a type is an arithmetic type (class template) [edit] |
| (C++11) |
checks if a type is a scalar type (class template) [edit] |
| (C++11) |
checks if a type is an object type (class template) [edit] |
| (C++11) |
checks if a type is a compound type (class template) [edit] |
| (C++11) |
checks if a type is either an lvalue reference or rvalue reference (class template) [edit] |
| (C++11) |
checks if a type is a pointer to a non-static member function or object (class template) [edit] |
Type properties | |
| Defined in header | |
| (C++11) |
checks if a type is const-qualified (class template) [edit] |
| (C++11) |
checks if a type is volatile-qualified (class template) [edit] |
| (C++11)(deprecated in C++26) |
checks if a type is trivial (class template) [edit] |
| (C++11) |
checks if a type is trivially copyable (class template) [edit] |
| (C++11) |
checks if a type is a standard-layout type (class template) [edit] |
| (C++11)(deprecated in C++20) |
checks if a type is a plain-old data (POD) type (class template) [edit] |
| (C++11)(deprecated in C++17)(removed in C++20) |
checks if a type is a literal type (class template) [edit] |
| checks if every bit in the type's object representation contributes to its value (class template) [edit] | |
| (C++11) |
checks if a type is a class (but not union) type and has no non-static data members (class template) [edit] |
| (C++11) |
checks if a type is a polymorphic class type (class template) [edit] |
| (C++11) |
checks if a type is an abstract class type (class template) [edit] |
| (C++14) |
checks if a type is a final class type (class template) [edit] |
| (C++17) |
checks if a type is an aggregate type (class template) [edit] |
| (C++23) |
checks if a type is an implicit-lifetime type (class template) [edit] |
| (C++11) |
checks if a type is a signed arithmetic type (class template) [edit] |
| (C++11) |
checks if a type is an unsigned arithmetic type (class template) [edit] |
| (C++20) |
checks if a type is an array type of known bound (class template) [edit] |
| (C++20) |
checks if a type is an array type of unknown bound (class template) [edit] |
| (C++23) |
checks if a type is a scoped enumeration type (class template) [edit] |
Supported operations | |
| Defined in header | |
| (C++11)(C++11)(C++11) |
checks if a type has a constructor for specific arguments (class template) [edit] |
| checks if a type has a default constructor (class template) [edit] | |
| (C++11)(C++11)(C++11) |
checks if a type has a copy constructor (class template) [edit] |
| (C++11)(C++11)(C++11) |
checks if a type can be constructed from an rvalue reference (class template) [edit] |
| (C++11)(C++11)(C++11) |
checks if a type has an assignment operator for a specific argument (class template) [edit] |
| (C++11)(C++11)(C++11) |
checks if a type has a copy assignment operator (class template) [edit] |
| (C++11)(C++11)(C++11) |
checks if a type has a move assignment operator (class template) [edit] |
| (C++11)(C++11)(C++11) |
checks if a type has a non-deleted destructor (class template) [edit] |
| (C++11) |
checks if a type has a virtual destructor (class template) [edit] |
| (C++17)(C++17)(C++17)(C++17) |
checks if objects of a type can be swapped with objects of same or different type (class template) [edit] |
| checks if a reference is bound to a temporary in direct-initialization (class template) [edit] | |
| checks if a reference is bound to a temporary in copy-initialization (class template) [edit] | |
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.
| (C++11) |
obtains the type's alignment requirements (class template) [edit] |
| (C++11) |
obtains the number of dimensions of an array type (class template) [edit] |
| (C++11) |
obtains the size of an array type along a specified dimension (class template) [edit] |
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 | |
| (C++11) |
checks if two types are the same (class template) [edit] |
| (C++11) |
checks if a type is a base of the other type (class template) [edit] |
| (C++26) |
checks if a type is a virtual base of the other type (class template) [edit] |
| (C++11)(C++20) |
checks if a type can be converted to the other type (class template) [edit] |
| (C++20) |
checks if two types are layout-compatible (class template) [edit] |
| checks if a type is a pointer-interconvertible (initial) base of another type (class template) [edit] | |
| checks if a type can be invoked (as if by std::invoke) with the given argument types (class template) [edit] | |
Type transformation traits transform one type to another following some predefined rules.
All these type traits satisfy TransformationTrait.
Const-volatility specifiers | |
| Defined in header | |
| (C++11)(C++11)(C++11) |
removes const and/or volatile specifiers from the given type (class template) [edit] |
| (C++11)(C++11)(C++11) |
adds const and/or volatile specifiers to the given type (class template) [edit] |
References | |
| Defined in header | |
| (C++11) |
removes a reference from the given type (class template) [edit] |
| (C++11)(C++11) |
adds an lvalue or rvalue reference to the given type (class template) [edit] |
Sign modifiers | |
| Defined in header | |
| (C++11) |
obtains the corresponding signed type for the given integral type (class template) [edit] |
| (C++11) |
obtains the corresponding signed type for the given integral type (class template) [edit] |
Arrays | |
| Defined in header | |
| (C++11) |
removes one extent from the given array type (class template) [edit] |
| (C++11) |
removes all extents from the given array type (class template) [edit] |
Pointers | |
| Defined in header | |
| (C++11) |
removes a pointer from the given type (class template) [edit] |
| (C++11) |
adds a pointer to the given type (class template) [edit] |
Other transformations | |
| Defined in header | |
| (since C++11)(deprecated in C++23) |
defines the type suitable for use as uninitialized storage for types of given size (class template) [edit] |
| (since C++11)(deprecated in C++23) |
defines the type suitable for use as uninitialized storage for all given types (class template) [edit] |
| (C++11) |
applies type transformations as when passing a function argument by value (class template) [edit] |
| (C++20) |
combines std::remove_cv and std::remove_reference (class template) [edit] |
| (C++11) |
conditionally removes a function overload or template specialization from overload resolution (class template) [edit] |
| (C++11) |
chooses one type or another based on compile-time boolean (class template) [edit] |
| (C++11) |
determines the common type of a group of types (class template) [edit] |
| determines the common reference type of a group of types (class template) [edit] | |
| (C++11) |
obtains the underlying integer type for a given enumeration type (class template) [edit] |
| (C++11)(removed in C++20)(C++17) |
deduces the result type of invoking a callable object with a set of arguments (class template) [edit] |
| (C++17) |
void variadic alias template (alias template)[edit] |
| (C++20) |
returns the type argument unchanged (class template) [edit] |
Logical operator traits apply logical operators to other type traits.
The header <ratio> provides types and functions for manipulating and storing compile-time ratios.