30 template<
class T,
class... Args>
33 (sizeof...(Args) == 1)
34 && (std::is_same_v<std::remove_cvref_t<Args>, std::remove_cvref_t<T>> && ...)
38 template<
class T,
class... Args>
39 inline constexpr bool resolve_to_copy_v{
resolve_to_copy<T, Args...>::value};
41 template<
class T,
class... Args>
42 using resolve_to_copy_t =
typename resolve_to_copy<T, Args...>::type;
65 using is_const_pointer_t =
typename is_const_pointer<T>::type;
70 : std::bool_constant<std::is_reference_v<T> && std::is_const_v<std::remove_reference_t<T>>>
77 using is_const_reference_t =
typename is_const_reference<T>::type;
84 struct is_tuple<std::tuple<Ts...>> : std::true_type{};
87 using is_tuple_t =
typename is_tuple<Ts...>::type;
90 inline constexpr bool is_tuple_v{
is_tuple<Ts...>::value};
95 template<
class T,
class... Args>
99 template<
class T,
class... Args>
100 requires requires (Args&&... args) { T{std::forward<Args>(args)...}; }
103 template<
class T,
class... Args>
106 template<
class T,
class... Args>
107 inline constexpr bool is_initializable_v{
is_initializable<T, Args...>::value};
145 inline constexpr bool has_gettable_elements{
requires (T & t) { std::get<0>(t); }};
148 struct is_deep_equality_comparable;
150 template<
class T, std::size_t... I>
151 inline constexpr bool heterogeneous_deep_equality_v{
152 requires(T & t, std::index_sequence<I...>) {
153 requires (is_deep_equality_comparable<std::remove_cvref_t<decltype(std::get<I>(t))>>::value && ...);
157 template<
class T, std::size_t...I>
158 constexpr bool has_heterogeneous_deep_equality(std::index_sequence<I...>)
160 return heterogeneous_deep_equality_v<T, I...>;
166 template<
template<
class...>
class T,
class... Ts>
168 : std::bool_constant<has_heterogeneous_deep_equality<T<Ts...>>(std::make_index_sequence<sizeof...(Ts)>{})>
176 requires has_value_type_v<T>
177 struct is_deep_equality_comparable<T> : std::bool_constant<std::equality_comparable<T>&& is_deep_equality_comparable<typename T::value_type>::value>
180 template<
template<
class...>
class T,
class... Ts>
189 using is_deep_equality_comparable_t =
typename is_deep_equality_comparable<T>::type;
202 template<std::
floating_po
int T,
class U>
203 struct is_compatible : std::bool_constant<!std::is_same_v<U, bool> && ((std::floating_point<U> && is_initializable_v<T, U>) || std::is_integral_v<U>)> {};
205 template<std::
floating_po
int T,
class U>
208 template<std::
floating_po
int T,
class U>
constexpr bool has_value_type_v
Checks for dependent type value_type
Definition: TypeTraits.hpp:123
constexpr bool has_element_type_v
Checks for dependent type element_type
Definition: TypeTraits.hpp:127
Standard meta-programming utility.
Definition: TypeTraits.hpp:27
Class template for determining if a type defines a nested type allocator_type
Definition: TypeTraits.hpp:113
Definition: TypeTraits.hpp:164
class template for determining if a type is compatible with a floating-point type.
Definition: TypeTraits.hpp:203
Primary class template for determining if a type is a const pointer.
Definition: TypeTraits.hpp:47
class template for determining if a type is a const reference
Definition: TypeTraits.hpp:71
Definition: TypeTraits.hpp:173
Primary class template for determining if a type can be brace-initialized by Args....
Definition: TypeTraits.hpp:97
Primary class template for determining if a type is a std::tuple
Definition: TypeTraits.hpp:81
class template for determining whether a constructor template should resolve to the copy constructor
Definition: TypeTraits.hpp:36