Metaprogramming library (since C++11)
C++ provides metaprogramming facilities, such as type traits, compile-time rational arithmetic, and compile-time integer sequences.
Contents |
[edit] 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.
[edit] 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 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.
[edit] Base classes
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.
Defined in header
<type_traits> | |
(C++11)(C++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> |
[edit] 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> | |
(C++11) |
checks if a type is void (class template) |
(C++11)(DR*) |
checks if a type is std::nullptr_t (class template) |
(C++11) |
checks if a type is an integral type (class template) |
(C++11) |
checks if a type is a floating-point type (class template) |
(C++11) |
checks if a type is an array type (class template) |
(C++11) |
checks if a type is an enumeration type (class template) |
(C++11) |
checks if a type is a union type (class template) |
(C++11) |
checks if a type is a non-union class type (class template) |
(C++11) |
checks if a type is a function type (class template) |
(C++11) |
checks if a type is a pointer type (class template) |
(C++11) |
checks if a type is an lvalue reference (class template) |
(C++11) |
checks if a type is an rvalue reference (class template) |