34 #ifndef _GLIBCXX_EXPERIMENTAL_TYPE_TRAITS
35 #define _GLIBCXX_EXPERIMENTAL_TYPE_TRAITS 1
37 #pragma GCC system_header
39 #if __cplusplus >= 201402L
44 namespace std _GLIBCXX_VISIBILITY(default)
46 _GLIBCXX_BEGIN_NAMESPACE_VERSION
48 namespace experimental
50 inline namespace fundamentals_v1
52 #define __cpp_lib_experimental_type_trait_variable_templates 201402
55 template <
typename _Tp>
56 constexpr
bool is_void_v = is_void<_Tp>::value;
57 template <
typename _Tp>
58 constexpr
bool is_null_pointer_v = is_null_pointer<_Tp>::value;
59 template <
typename _Tp>
60 constexpr
bool is_integral_v = is_integral<_Tp>::value;
61 template <
typename _Tp>
62 constexpr
bool is_floating_point_v = is_floating_point<_Tp>::value;
63 template <
typename _Tp>
64 constexpr
bool is_array_v = is_array<_Tp>::value;
65 template <
typename _Tp>
66 constexpr
bool is_pointer_v = is_pointer<_Tp>::value;
67 template <
typename _Tp>
68 constexpr
bool is_lvalue_reference_v = is_lvalue_reference<_Tp>::value;
69 template <
typename _Tp>
70 constexpr
bool is_rvalue_reference_v = is_rvalue_reference<_Tp>::value;
71 template <
typename _Tp>
72 constexpr
bool is_member_object_pointer_v =
73 is_member_object_pointer<_Tp>::value;
74 template <
typename _Tp>
75 constexpr
bool is_member_function_pointer_v =
76 is_member_function_pointer<_Tp>::value;
77 template <
typename _Tp>
78 constexpr
bool is_enum_v = is_enum<_Tp>::value;
79 template <
typename _Tp>
80 constexpr
bool is_union_v = is_union<_Tp>::value;
81 template <
typename _Tp>
82 constexpr
bool is_class_v = is_class<_Tp>::value;
83 template <
typename _Tp>
84 constexpr
bool is_function_v = is_function<_Tp>::value;
87 template <
typename _Tp>
88 constexpr
bool is_reference_v = is_reference<_Tp>::value;
89 template <
typename _Tp>
90 constexpr
bool is_arithmetic_v = is_arithmetic<_Tp>::value;
91 template <
typename _Tp>
92 constexpr
bool is_fundamental_v = is_fundamental<_Tp>::value;
93 template <
typename _Tp>
94 constexpr
bool is_object_v = is_object<_Tp>::value;
95 template <
typename _Tp>
96 constexpr
bool is_scalar_v = is_scalar<_Tp>::value;
97 template <
typename _Tp>
98 constexpr
bool is_compound_v = is_compound<_Tp>::value;
99 template <
typename _Tp>
100 constexpr
bool is_member_pointer_v = is_member_pointer<_Tp>::value;
103 template <
typename _Tp>
104 constexpr
bool is_const_v = is_const<_Tp>::value;
105 template <
typename _Tp>
106 constexpr
bool is_volatile_v = is_volatile<_Tp>::value;
107 template <
typename _Tp>
108 constexpr
bool is_trivial_v = is_trivial<_Tp>::value;
109 template <
typename _Tp>
110 constexpr
bool is_trivially_copyable_v = is_trivially_copyable<_Tp>::value;
111 template <
typename _Tp>
112 constexpr
bool is_standard_layout_v = is_standard_layout<_Tp>::value;
113 template <
typename _Tp>
114 constexpr
bool is_pod_v = is_pod<_Tp>::value;
115 template <
typename _Tp>
116 constexpr
bool is_literal_type_v = is_literal_type<_Tp>::value;
117 template <
typename _Tp>
118 constexpr
bool is_empty_v = is_empty<_Tp>::value;
119 template <
typename _Tp>
120 constexpr
bool is_polymorphic_v = is_polymorphic<_Tp>::value;
121 template <
typename _Tp>
122 constexpr
bool is_abstract_v = is_abstract<_Tp>::value;
123 template <
typename _Tp>
124 constexpr
bool is_final_v = is_final<_Tp>::value;
125 template <
typename _Tp>
126 constexpr
bool is_signed_v = is_signed<_Tp>::value;
127 template <
typename _Tp>
128 constexpr
bool is_unsigned_v = is_unsigned<_Tp>::value;
129 template <
typename _Tp,
typename... _Args>
130 constexpr
bool is_constructible_v = is_constructible<_Tp, _Args...>::value;
131 template <
typename _Tp>
132 constexpr
bool is_default_constructible_v =
133 is_default_constructible<_Tp>::value;
134 template <
typename _Tp>
135 constexpr
bool is_copy_constructible_v = is_copy_constructible<_Tp>::value;
136 template <
typename _Tp>
137 constexpr
bool is_move_constructible_v = is_move_constructible<_Tp>::value;
138 template <
typename _Tp,
typename _Up>
139 constexpr
bool is_assignable_v = is_assignable<_Tp, _Up>::value;
140 template <
typename _Tp>
141 constexpr
bool is_copy_assignable_v = is_copy_assignable<_Tp>::value;
142 template <
typename _Tp>
143 constexpr
bool is_move_assignable_v = is_move_assignable<_Tp>::value;
144 template <
typename _Tp>
145 constexpr
bool is_destructible_v = is_destructible<_Tp>::value;
146 template <
typename _Tp,
typename... _Args>
147 constexpr
bool is_trivially_constructible_v =
148 is_trivially_constructible<_Tp, _Args...>::value;
149 template <
typename _Tp>
150 constexpr
bool is_trivially_default_constructible_v =
151 is_trivially_default_constructible<_Tp>::value;
152 template <
typename _Tp>
153 constexpr
bool is_trivially_copy_constructible_v =
154 is_trivially_copy_constructible<_Tp>::value;
155 template <
typename _Tp>
156 constexpr
bool is_trivially_move_constructible_v =
157 is_trivially_move_constructible<_Tp>::value;
158 template <
typename _Tp,
typename _Up>
159 constexpr
bool is_trivially_assignable_v =
160 is_trivially_assignable<_Tp, _Up>::value;
161 template <
typename _Tp>
162 constexpr
bool is_trivially_copy_assignable_v =
163 is_trivially_copy_assignable<_Tp>::value;
164 template <
typename _Tp>
165 constexpr
bool is_trivially_move_assignable_v =
166 is_trivially_move_assignable<_Tp>::value;
167 template <
typename _Tp>
168 constexpr
bool is_trivially_destructible_v =
169 is_trivially_destructible<_Tp>::value;
170 template <
typename _Tp,
typename... _Args>
171 constexpr
bool is_nothrow_constructible_v =
172 is_nothrow_constructible<_Tp, _Args...>::value;
173 template <
typename _Tp>
174 constexpr
bool is_nothrow_default_constructible_v =
175 is_nothrow_default_constructible<_Tp>::value;
176 template <
typename _Tp>
177 constexpr
bool is_nothrow_copy_constructible_v =
178 is_nothrow_copy_constructible<_Tp>::value;
179 template <
typename _Tp>
180 constexpr
bool is_nothrow_move_constructible_v =
181 is_nothrow_move_constructible<_Tp>::value;
182 template <
typename _Tp,
typename _Up>
183 constexpr
bool is_nothrow_assignable_v =
184 is_nothrow_assignable<_Tp, _Up>::value;
185 template <
typename _Tp>
186 constexpr
bool is_nothrow_copy_assignable_v =
187 is_nothrow_copy_assignable<_Tp>::value;
188 template <
typename _Tp>
189 constexpr
bool is_nothrow_move_assignable_v =
190 is_nothrow_move_assignable<_Tp>::value;
191 template <
typename _Tp>
192 constexpr
bool is_nothrow_destructible_v =
193 is_nothrow_destructible<_Tp>::value;
194 template <
typename _Tp>
195 constexpr
bool has_virtual_destructor_v =
196 has_virtual_destructor<_Tp>::value;
199 template <
typename _Tp>
200 constexpr
size_t alignment_of_v = alignment_of<_Tp>::value;
201 template <
typename _Tp>
202 constexpr
size_t rank_v = rank<_Tp>::value;
203 template <
typename _Tp,
unsigned _Idx = 0>
204 constexpr
size_t extent_v = extent<_Tp, _Idx>::value;
207 template <
typename _Tp,
typename _Up>
208 constexpr
bool is_same_v = is_same<_Tp, _Up>::value;
209 template <
typename _Base,
typename _Derived>
210 constexpr
bool is_base_of_v = is_base_of<_Base, _Derived>::value;
211 template <
typename _From,
typename _To>
212 constexpr
bool is_convertible_v = is_convertible<_From, _To>::value;
222 inline namespace fundamentals_v2
224 #define __cpp_lib_experimental_detect 201505
228 template<
typename...>
using void_t = void;
230 #pragma GCC diagnostic push
231 #pragma GCC diagnostic ignored "-Wctor-dtor-privacy"
232 struct __nonesuchbase {};
233 struct nonesuch :
private __nonesuchbase
235 ~nonesuch() =
delete;
236 nonesuch(nonesuch
const&) =
delete;
237 void operator=(nonesuch
const&) =
delete;
239 #pragma GCC diagnostic pop
241 template<
template<
typename...>
class _Op,
typename... _Args>
245 template<
template<
typename...>
class _Op,
typename... _Args>
246 constexpr
bool is_detected_v = is_detected<_Op, _Args...>::value;
248 template<
template<
typename...>
class _Op,
typename... _Args>
252 template<
typename _Default,
template<
typename...>
class _Op,
typename... _Args>
255 template<
typename _Default,
template<
typename...>
class _Op,
typename... _Args>
256 using detected_or_t =
typename detected_or<_Default, _Op, _Args...>::type;
258 template<
typename _Expected,
template<
typename...>
class _Op,
typename... _Args>
259 using is_detected_exact = is_same<_Expected, detected_t<_Op, _Args...>>;
261 template<
typename _Expected,
template<
typename...>
class _Op,
typename... _Args>
262 constexpr
bool is_detected_exact_v
263 = is_detected_exact<_Expected, _Op, _Args...>::value;
265 template<
typename _To,
template<
typename...>
class _Op,
typename... _Args>
266 using is_detected_convertible
267 = is_convertible<detected_t<_Op, _Args...>, _To>;
269 template<
typename _To,
template<
typename...>
class _Op,
typename... _Args>
270 constexpr
bool is_detected_convertible_v
271 = is_detected_convertible<_To, _Op, _Args...>::value;
273 #define __cpp_lib_experimental_logical_traits 201511
275 template<
typename... _Bn>
280 template<
typename... _Bn>
285 template<
typename _Pp>
290 template<
typename... _Bn>
291 constexpr
bool conjunction_v
292 = conjunction<_Bn...>::value;
294 template<
typename... _Bn>
295 constexpr
bool disjunction_v
296 = disjunction<_Bn...>::value;
298 template<
typename _Pp>
299 constexpr
bool negation_v
300 = negation<_Pp>::value;
304 _GLIBCXX_END_NAMESPACE_VERSION
307 #endif // __cplusplus <= 201103L
309 #endif // _GLIBCXX_EXPERIMENTAL_TYPE_TRAITS