Metaprogramming
Utilities
Collaboration diagram for Metaprogramming:

## Modules

| Variable templates for type traits

## Classes

struct | std::__is_nullptr_t< _Tp >
struct | std::tr2::__reflection_typelist< _Elements >
struct | std::add_lvalue_reference< _Tp >
struct | std::add_pointer< _Tp >
struct | std::add_rvalue_reference< _Tp >
struct | std::common_type< _Tp >
struct | std::enable_if< bool, _Tp >
struct | std::extent< typename, _Uint >
struct | std::is_abstract< _Tp >
struct | std::is_aggregate< _Tp >
struct | std::is_arithmetic< _Tp >
struct | std::is_array< typename >
struct | std::is_base_of< _Base, _Derived >
struct | std::is_bounded_array< _Tp >
struct | std::is_class< _Tp >
struct | std::is_compound< _Tp >
struct | std::is_const< typename >
struct | std::is_convertible< _From, _To >
struct | std::is_empty< _Tp >
struct | std::is_enum< _Tp >
struct | std::is_final< _Tp >
struct | std::is_floating_point< _Tp >
struct | std::is_function< _Tp >
struct | std::is_fundamental< _Tp >
struct | std::is_integral< _Tp >
struct | std::is_layout_compatible< _Tp, _Up >
struct | std::is_lvalue_reference< typename >
struct | std::is_member_function_pointer< _Tp >
struct | std::is_member_object_pointer< _Tp >
struct | std::is_member_pointer< _Tp >
struct | std::is_nothrow_convertible< _From, _To >
struct | std::is_null_pointer< _Tp >
struct | std::is_object< _Tp >
struct | std::is_pointer< _Tp >
struct | std::is_pointer_interconvertible_base_of< _Base, _Derived >
struct | std::is_polymorphic< _Tp >
struct | std::is_reference< _Tp >
struct | std::is_rvalue_reference< typename >
struct | std::is_same< _Tp, _Up >
struct | std::is_scalar< _Tp >
struct | std::is_signed< _Tp >
struct | std::is_unbounded_array< _Tp >
struct | std::is_union< _Tp >
struct | std::is_unsigned< _Tp >
struct | std::is_void< _Tp >
struct | std::is_volatile< typename >
struct | std::rank< typename >
struct | std::remove_all_extents< _Tp >
struct | std::remove_cv< _Tp >
struct | std::remove_pointer< _Tp >
struct | std::result_of< _Signature >
struct | std::underlying_type< _Tp >

## Macros

#define | __cpp_lib_bool_constant
#define | __cpp_lib_bounded_array_traits
#define | __cpp_lib_has_unique_object_representations
#define | __cpp_lib_is_aggregate
#define | __cpp_lib_is_constant_evaluated
#define | __cpp_lib_is_final
#define | __cpp_lib_is_invocable
#define | __cpp_lib_is_layout_compatible
#define | __cpp_lib_is_nothrow_convertible
#define | __cpp_lib_is_null_pointer
#define | __cpp_lib_is_pointer_interconvertible
#define | __cpp_lib_is_swappable
#define | __cpp_lib_logical_traits
#define | __cpp_lib_result_of_sfinae
#define | __cpp_lib_transformation_trait_aliases
#define | __cpp_lib_type_trait_variable_templates
#define | __cpp_lib_unwrap_ref
#define | __cpp_lib_void_t

## Typedefs

template<bool _Cond, typename _If , typename _Else >
using | std::__conditional_t = typename __conditional< _Cond >::template type< _If, _Else >
template<typename _ToElementType , typename _FromElementType >
using | std::__is_array_convertible = is_convertible< _FromElementType(*)[], _ToElementType(*)[]>
template<typename _Tp , typename _Up >
using | std::__is_nothrow_assignable_impl = __bool_constant< __is_nothrow_assignable(_Tp, _Up)>
template<typename _Tp >
using | std::add_const_t = typename add_const< _Tp >::type
template<typename _Tp >
using | std::add_cv_t = typename add_cv< _Tp >::type
template<typename _Tp >
using | std::add_lvalue_reference_t = typename add_lvalue_reference< _Tp >::type
template<typename _Tp >
using | std::add_pointer_t = typename add_pointer< _Tp >::type
template<typename _Tp >
using | std::add_rvalue_reference_t = typename add_rvalue_reference< _Tp >::type
template<typename _Tp >
using | std::add_volatile_t = typename add_volatile< _Tp >::type
template<size_t _Len, size_t _Align = __alignof__(typename __aligned_storage_msa<_Len>::__type)>
using | std::aligned_storage_t = typename aligned_storage< _Len, _Align >::type
template<size_t _Len, typename... _Types>
using | std::aligned_union_t = typename aligned_union< _Len, _Types... >::type
template<bool __v>
using | std::bool_constant = integral_constant< bool, __v >
template<typename... _Tp>
using | std::common_reference_t = typename common_reference< _Tp... >::type
template<typename... _Tp>
using | std::common_type_t = typename common_type< _Tp... >::type
template<bool _Cond, typename _Iftrue , typename _Iffalse >
using | std::conditional_t = typename conditional< _Cond, _Iftrue, _Iffalse >::type
template<typename _Tp >
using | std::decay_t = typename decay< _Tp >::type
template<bool _Cond, typename _Tp = void>
using | std::enable_if_t = typename enable_if< _Cond, _Tp >::type
using | std::false_type = integral_constant< bool, false >
template<typename _Fn , typename... _Args>
using | std::invoke_result_t = typename invoke_result< _Fn, _Args... >::type
template<typename _Tp >
using | std::make_signed_t = typename make_signed< _Tp >::type
template<typename _Tp >
using | std::make_unsigned_t = typename make_unsigned< _Tp >::type
template<typename _Tp >
using | std::remove_all_extents_t = typename remove_all_extents< _Tp >::type
template<typename _Tp >
using | std::remove_const_t = typename remove_const< _Tp >::type
template<typename _Tp >
using | std::remove_cv_t = typename remove_cv< _Tp >::type
template<typename _Tp >
using | std::remove_extent_t = typename remove_extent< _Tp >::type
template<typename _Tp >
using | std::remove_pointer_t = typename remove_pointer< _Tp >::type
template<typename _Tp >
using | std::remove_reference_t = typename remove_reference< _Tp >::type
template<typename _Tp >
using | std::remove_volatile_t = typename remove_volatile< _Tp >::type
template<typename _Tp >
using | std::result_of_t = typename result_of< _Tp >::type
using | std::true_type = integral_constant< bool, true >
template<typename _Tp >
using | std::underlying_type_t = typename underlying_type< _Tp >::type
template<typename... >
using | std::void_t = void

## Functions

constexpr bool | std::is_constant_evaluated () noexcept
template<typename _S1 , typename _S2 , typename _M1 , typename _M2 >
constexpr bool | std::is_corresponding_member (_M1 _S1::*__m1, _M2 _S2::*__m2) noexcept
template<typename _Tp , typename _Mem >
constexpr bool | std::is_pointer_interconvertible_with_class (_Mem _Tp::*__mp) noexcept
template<typename _Tp >
constexpr _Require< __not_< __is_tuple_like< _Tp > >, is_move_constructible< _Tp >, is_move_assignable< _Tp > > | std::swap (_Tp &, _Tp &) noexcept(__and_< is_nothrow_move_constructible< _Tp >, is_nothrow_move_assignable< _Tp >>::value)
template<typename _Tp , size_t _Nm>
constexpr __enable_if_t< __is_swappable< _Tp >::value > | std::swap (_Tp(&__a)[_Nm], _Tp(&__b)[_Nm]) noexcept(__is_nothrow_swappable< _Tp >::value)

## Variables

static const size_t | std::aligned_union< _Len, _Types >::alignment_value
template<typename _From , typename _To >
constexpr bool | std::is_nothrow_convertible_v
template<typename _Tp >
constexpr bool | std::is_nothrow_swappable_v
template<typename _Tp , typename _Up >
constexpr bool | std::is_nothrow_swappable_with_v
template<typename _Tp >
constexpr bool | std::is_swappable_v
template<typename _Tp , typename _Up >
constexpr bool | std::is_swappable_with_v
template<typename _Tp >
using | std::remove_cvref_t = typename remove_cvref< _Tp >::type
#define | __cpp_lib_remove_cvref
template<typename _Tp >
using | std::type_identity_t = typename type_identity< _Tp >::type
#define | __cpp_lib_type_identity
template<typename _Tp >
using | std::unwrap_reference_t = typename unwrap_reference< _Tp >::type
template<typename _Tp >
using | std::unwrap_ref_decay_t = typename unwrap_ref_decay< _Tp >::type
template<typename... _Bn>
constexpr bool | std::disjunction_v
template<typename _Pp >
constexpr bool | std::negation_v
template<typename _Tp >
constexpr bool | std::is_null_pointer_v
template<typename _Tp >
constexpr bool | std::is_integral_v
template<typename _Tp >
constexpr bool | std::is_floating_point_v
template<typename _Tp >
constexpr bool | std::is_array_v
template<typename _Tp >
constexpr bool | std::is_pointer_v
template<typename _Tp >
constexpr bool | std::is_lvalue_reference_v
template<typename _Tp >
constexpr bool | std::is_rvalue_reference_v
template<typename _Tp >
constexpr bool | std::is_member_object_pointer_v
template<typename _Tp >
constexpr bool | std::is_member_function_pointer_v
template<typename _Tp >
constexpr bool | std::is_enum_v
template<typename _Tp >
constexpr bool | std::is_union_v
template<typename _Tp >
constexpr bool | std::is_class_v
template<typename _Tp >
constexpr bool | std::is_function_v
template<typename _Tp >
constexpr bool | std::is_reference_v
template<typename _Tp >
constexpr bool | std::is_arithmetic_v
template<typename _Tp >
constexpr bool | std::is_fundamental_v
template<typename _Tp >
constexpr bool | std::is_object_v
template<typename _Tp >
constexpr bool | std::is_scalar_v
template<typename _Tp >
constexpr bool | std::is_compound_v
template<typename _Tp >
constexpr bool | std::is_member_pointer_v
template<typename _Tp >
constexpr bool | std::is_const_v
template<typename _Tp >
constexpr bool | std::is_volatile_v
template<typename _Tp >
constexpr bool | std::is_trivial_v
template<typename _Tp >
constexpr bool | std::is_trivially_copyable_v
template<typename _Tp >
constexpr bool | std::is_standard_layout_v
template<typename _Tp >
constexpr bool | std::is_pod_v
template<typename _Tp >
constexpr bool | std::is_literal_type_v
template<typename _Tp >
constexpr bool | std::is_empty_v
template<typename _Tp >
constexpr bool | std::is_polymorphic_v
template<typename _Tp >
constexpr bool | std::is_abstract_v
template<typename _Tp >
constexpr bool | std::is_final_v
template<typename _Tp >
constexpr bool | std::is_signed_v
template<typename _Tp >
constexpr bool | std::is_unsigned_v
template<typename _Tp , typename... _Args>
constexpr bool | std::is_constructible_v
template<typename _Tp >
constexpr bool | std::is_default_constructible_v
template<typename _Tp >
constexpr bool | std::is_copy_constructible_v
template<typename _Tp >
constexpr bool | std::is_move_constructible_v
template<typename _Tp , typename _Up >
constexpr bool | std::is_assignable_v
template<typename _Tp >
constexpr bool | std::is_copy_assignable_v
template<typename _Tp >
constexpr bool | std::is_move_assignable_v
template<typename _Tp >
constexpr bool | std::is_destructible_v
template<typename _Tp , typename... _Args>
constexpr bool | std::is_trivially_constructible_v
template<typename _Tp >
constexpr bool | std::is_trivially_default_constructible_v
template<typename _Tp >
constexpr bool | std::is_trivially_copy_constructible_v
template<typename _Tp >
constexpr bool | std::is_trivially_move_constructible_v
template<typename _Tp , typename _Up >
constexpr bool | std::is_trivially_assignable_v
template<typename _Tp >
constexpr bool | std::is_trivially_copy_assignable_v
template<typename _Tp >
constexpr bool | std::is_trivially_move_assignable_v
template<typename _Tp >
constexpr bool | std::is_trivially_destructible_v
template<typename _Tp , typename... _Args>
constexpr bool | std::is_nothrow_constructible_v
template<typename _Tp >
constexpr bool | std::is_nothrow_default_constructible_v
template<typename _Tp >
constexpr bool | std::is_nothrow_copy_constructible_v
template<typename _Tp >
constexpr bool | std::is_nothrow_move_constructible_v
template<typename _Tp , typename _Up >
constexpr bool | std::is_nothrow_assignable_v
template<typename _Tp >
constexpr bool | std::is_nothrow_copy_assignable_v
template<typename _Tp >
constexpr bool | std::is_nothrow_move_assignable_v
template<typename _Tp >
constexpr bool | std::is_nothrow_destructible_v
template<typename _Tp >
constexpr bool | std::has_virtual_destructor_v
template<typename _Tp >
constexpr size_t | std::alignment_of_v
template<typename _Tp >
constexpr size_t | std::rank_v
template<typename _Tp , unsigned _Idx = 0>
constexpr size_t | std::extent_v
template<typename _Tp , typename _Up >
constexpr bool | std::is_same_v
template<typename _Base , typename _Derived >
constexpr bool | std::is_base_of_v
template<typename _From , typename _To >
constexpr bool | std::is_convertible_v
template<typename _Fn , typename... _Args>
constexpr bool | std::is_invocable_v
template<typename _Fn , typename... _Args>
constexpr bool | std::is_nothrow_invocable_v
template<typename _Ret , typename _Fn , typename... _Args>
constexpr bool | std::is_invocable_r_v
template<typename _Ret , typename _Fn , typename... _Args>
constexpr bool | std::is_nothrow_invocable_r_v

## Detailed Description

Template utilities for compile-time introspection and modification, including type classification traits, type property inspection traits and type transformation traits.

Since
  C++11

## Macro Definition Documentation

## __cpp_lib_remove_cvref

#define __cpp_lib_remove_cvref

- Remove references and cv-qualifiers.
  Since
    C++20

Definition at line 3340 of file type_traits.

## __cpp_lib_type_identity

#define __cpp_lib_type_identity

- Identity metafunction.
  Since
    C++20

Definition at line 3365 of file type_traits.

## Typedef Documentation

## add_const_t

template<typename _Tp >

using std::add_const_t = typedef typename add_const<_Tp>::type

Alias template for add_const.

Definition at line 1607 of file type_traits.

## add_cv_t

template<typename _Tp >

using std::add_cv_t = typedef typename add_cv<_Tp>::type

Alias template for add_cv.

Definition at line 1615 of file type_traits.

## add_lvalue_reference_t

template<typename _Tp >

using std::add_lvalue_reference_t = typedef typename add_lvalue_reference<_Tp>::type

Alias template for add_lvalue_reference.

Definition at line 1668 of file type_traits.

## add_pointer_t

template<typename _Tp >

using std::add_pointer_t = typedef typename add_pointer<_Tp>::type

Alias template for add_pointer.

Definition at line 2082 of file type_traits.

## add_rvalue_reference_t

template<typename _Tp >

using std::add_rvalue_reference_t = typedef typename add_rvalue_reference<_Tp>::type

Alias template for add_rvalue_reference.

Definition at line 1672 of file type_traits.

## add_volatile_t

template<typename _Tp >

using std::add_volatile_t = typedef typename add_volatile<_Tp>::type

Alias template for add_volatile.

Definition at line 1611 of file type_traits.

## aligned_storage_t

template<size_t _Len, size_t _Align = __alignof__(typename __aligned_storage_msa<_Len>::__type)>

using std::aligned_storage_t = typedef typename aligned_storage<_Len, _Align>::type

Alias template for aligned_storage.

Definition at line 2597 of file type_traits.

## bool_constant

template<bool __v>

using std::bool_constant = typedef integral_constant<bool, __v>

Alias template for compile-time boolean constant types.

Since
  C++17

Definition at line 98 of file type_traits.

## common_type_t

template<typename... _Tp>

using std::common_type_t = typedef typename common_type<_Tp...>::type

Alias template for common_type.

Definition at line 2616 of file type_traits.

## conditional_t

template<bool _Cond, typename _Iftrue , typename _Iffalse >

using std::conditional_t = typedef typename conditional<_Cond, _Iftrue, _Iffalse>::type

Alias template for conditional.

Definition at line 2612 of file type_traits.

## decay_t

template<typename _Tp >

using std::decay_t = typedef typename decay<_Tp>::type

Alias template for decay.

Definition at line 2604 of file type_traits.

## enable_if_t

template<bool _Cond, typename _Tp = void>

using std::enable_if_t = typedef typename enable_if<_Cond, _Tp>::type

Alias template for enable_if.

Definition at line 2608 of file type_traits.

## false_type

using std::false_type = typedef integral_constant<bool, false>

The type used as a compile-time boolean with false value.

Definition at line 85 of file type_traits.

## invoke_result_t

template<typename _Fn , typename... _Args>

using std::invoke_result_t = typedef typename invoke_result<_Fn, _Args...>::type

std::invoke_result_t

Definition at line 3041 of file type_traits.

## make_signed_t

template<typename _Tp >

using std::make_signed_t = typedef typename make_signed<_Tp>::type

Alias template for make_signed.

Definition at line 1999 of file type_traits.

## make_unsigned_t

template<typename _Tp >

using std::make_unsigned_t = typedef typename make_unsigned<_Tp>::type

Alias template for make_unsigned.

Definition at line 2003 of file type_traits.

## remove_all_extents_t

template<typename _Tp >

using std::remove_all_extents_t = typedef typename remove_all_extents<_Tp>::type

Alias template for remove_all_extents.

Definition at line 2041 of file type_traits.

## remove_const_t

template<typename _Tp >

using std::remove_const_t = typedef typename remove_const<_Tp>::type

Alias template for remove_const.

Definition at line 1595 of file type_traits.

## remove_cv_t

template<typename _Tp >

using std::remove_cv_t = typedef typename remove_cv<_Tp>::type

Alias template for remove_cv.

Definition at line 1603 of file type_traits.

## remove_cvref_t

template<typename _Tp >

using std::remove_cvref_t = typedef typename remove_cvref<_Tp>::type

- Remove references and cv-qualifiers.
  Since
    C++20

Definition at line 3358 of file type_traits.

## remove_extent_t

template<typename _Tp >

using std::remove_extent_t = typedef typename remove_extent<_Tp>::type

Alias template for remove_extent.

Definition at line 2037 of file type_traits.

## remove_pointer_t

template<typename _Tp >

using std::remove_pointer_t = typedef typename remove_pointer<_Tp>::type

Alias template for remove_pointer.

Definition at line 2078 of file type_traits.

## remove_reference_t

template<typename _Tp >

using std::remove_reference_t = typedef typename remove_reference<_Tp>::type

Alias template for remove_reference.

Definition at line 1664 of file type_traits.

## remove_volatile_t

template<typename _Tp >

using std::remove_volatile_t = typedef typename remove_volatile<_Tp>::type

Alias template for remove_volatile.

Definition at line 1599 of file type_traits.

## result_of_t

template<typename _Tp >

using std::result_of_t = typedef typename result_of<_Tp>::type

Alias template for result_of.

Definition at line 2624 of file type_traits.

## true_type

using std::true_type = typedef integral_constant<bool, true>

The type used as a compile-time boolean with true value.

Definition at line 82 of file type_traits.

## type_identity_t

template<typename _Tp >

using std::type_identity_t = typedef typename type_identity<_Tp>::type

- Identity metafunction.
  Since
    C++20

Definition at line 3370 of file type_traits.

## underlying_type_t

template<typename _Tp >

using std::underlying_type_t = typedef typename underlying_type<_Tp>::type

Alias template for underlying_type.

Definition at line 2620 of file type_traits.

## void_t

template<typename... >

using std::void_t = typedef void

A metafunction that always yields void, used for detecting valid types.

Definition at line 2630 of file type_traits.

## Function Documentation

## is_constant_evaluated()

constexpr bool std::is_constant_evaluated | ( |  | ) |

inline constexpr noexcept

Returns true only when called during constant evaluation.

Since
  C++20

Definition at line 3520 of file type_traits.

Referenced by std::assume_aligned().

## is_corresponding_member()

template<typename _S1 , typename _S2 , typename _M1 , typename _M2 >

constexpr bool std::is_corresponding_member | ( | _M1 _S1::* | __m1,
|  | _M2 _S2::* | __m2
| ) |  |

constexpr noexcept

Since
  C++20

Definition at line 3448 of file type_traits.

## is_pointer_interconvertible_with_class()

template<typename _Tp , typename _Mem >

constexpr bool std::is_pointer_interconvertible_with_class | ( | _Mem _Tp::* | __mp | ) |

constexpr noexcept

True if `__mp` points to the first member of a standard-layout type.

Returns
  true if `s.*__mp` is pointer-interconvertible with `s`

Since
  C++20

Definition at line 3475 of file type_traits.

## swap() [1/2]

template<typename _Tp >

constexpr _Require<__not_<__is_tuple_like<_Tp> >, is_move_constructible<_Tp>, is_move_assignable<_Tp> > std::swap | ( | _Tp & | __a,
|  | _Tp & | __b
| ) |  |

inline constexpr noexcept

Swaps two values.

Parameters

  __a | A thing of arbitrary type.
  __b | Another thing of arbitrary type.

Returns
  Nothing.

Definition at line 196 of file move.h.

## swap() [2/2]

template<typename _Tp , size_t _Nm>

constexpr __enable_if_t<__is_swappable<_Tp>::value> std::swap | ( | _Tp(&) | __a[_Nm],
|  | _Tp(&) | __b[_Nm]
| ) |  |

inline constexpr noexcept

Swap the contents of two arrays.

Definition at line 220 of file move.h.

References std::swap().

## Variable Documentation

## alignment_value

template<size_t _Len, typename... _Types>

const size_t std::aligned_union< _Len, _Types >::alignment_value

static

The value of the strictest alignment of _Types.

Definition at line 2155 of file type_traits.

## is_nothrow_convertible_v

template<typename _From , typename _To >

constexpr bool std::is_nothrow_convertible_v

inline constexpr

is_nothrow_convertible_v

Definition at line 1530 of file type_traits.

## is_nothrow_swappable_v

template<typename _Tp >

constexpr bool std::is_nothrow_swappable_v

inline constexpr

is_nothrow_swappable_v

Definition at line 2794 of file type_traits.

## is_nothrow_swappable_with_v

template<typename _Tp , typename _Up >

constexpr bool std::is_nothrow_swappable_with_v

inline constexpr

is_nothrow_swappable_with_v

Definition at line 2890 of file type_traits.

## is_swappable_v

template<typename _Tp >

constexpr bool std::is_swappable_v

inline constexpr

is_swappable_v

Definition at line 2789 of file type_traits.

## is_swappable_with_v

template<typename _Tp , typename _Up >

constexpr bool std::is_swappable_with_v

inline constexpr

is_swappable_with_v

Definition at line 2885 of file type_traits.