@@ -260,23 +260,25 @@ template <typename T> constexpr auto is_ct_v<T const> = is_ct_v<T>;
260
260
261
261
#if __cplusplus >= 202002L
262
262
263
- #define CT_WRAP (X ) \
263
+ #define CT_WRAP (...) \
264
264
[&](auto f) { \
265
265
if constexpr (::stdx::is_ct_v<decltype (f ())>) { \
266
266
return f (); \
267
267
} else if constexpr (requires { \
268
- ::stdx::ct<[&]() constexpr { return X; }()>; \
268
+ ::stdx::ct<[&]() constexpr { \
269
+ return __VA_ARGS__; \
270
+ }()>; \
269
271
}) { \
270
- return ::stdx::ct<[&]() constexpr { return X ; }()>(); \
272
+ return ::stdx::ct<[&]() constexpr { return __VA_ARGS__ ; }()>(); \
271
273
} else { \
272
274
return f (); \
273
275
} \
274
- }([&] { return X ; })
276
+ }([&] { return __VA_ARGS__ ; })
275
277
276
278
#ifdef __clang__
277
- #define CX_DETECT (X ) \
279
+ #define CX_DETECT (...) \
278
280
std::is_empty_v<decltype ([&] { \
279
- return (X ) + ::stdx::cxv_detail::type_val{}; \
281
+ return (__VA_ARGS__ ) + ::stdx::cxv_detail::type_val{}; \
280
282
})>
281
283
#else
282
284
namespace stdx {
@@ -285,42 +287,42 @@ template <auto> constexpr auto cx_detect0() {}
285
287
constexpr auto cx_detect1 (auto ) { return 0 ; }
286
288
} // namespace v1
287
289
} // namespace stdx
288
- #define CX_DETECT (X ) \
290
+ #define CX_DETECT (...) \
289
291
requires { \
290
292
::stdx::cx_detect0<::stdx::cx_detect1 ( \
291
- (X ) + ::stdx::cxv_detail::type_val{})>; \
293
+ (__VA_ARGS__ ) + ::stdx::cxv_detail::type_val{})>; \
292
294
}
293
295
#endif
294
296
295
- #define CX_WRAP (X ) \
296
- [&](auto f) { \
297
+ #define CX_WRAP (...) \
298
+ [&]([[maybe_unused]] auto f) { \
297
299
STDX_PRAGMA (diagnostic push) \
298
300
STDX_PRAGMA (diagnostic ignored " -Wold-style-cast" ) \
299
- if constexpr (::stdx::is_cx_value_v< \
300
- std::invoke_result_t <decltype (f)>> or \
301
- std::is_empty_v<std::invoke_result_t <decltype (f)>>) { \
301
+ if constexpr (decltype (::stdx::cxv_detail::is_type< \
302
+ ::stdx::cxv_detail::from_any ( \
303
+ __VA_ARGS__)>())::value) { \
304
+ return ::stdx::overload{ \
305
+ ::stdx::cxv_detail::cx_base{}, [&] { \
306
+ return ::stdx::type_identity< \
307
+ decltype (::stdx::cxv_detail::type_of< \
308
+ ::stdx::cxv_detail::from_any ( \
309
+ __VA_ARGS__)>())>{}; \
310
+ }}; \
311
+ } else if constexpr (::stdx::is_cx_value_v< \
312
+ std::invoke_result_t <decltype (f)>> or \
313
+ std::is_empty_v< \
314
+ std::invoke_result_t <decltype (f)>>) { \
302
315
return f (); \
303
- } else if constexpr (CX_DETECT (X)) { \
304
- if constexpr (decltype (::stdx::cxv_detail::is_type< \
305
- ::stdx::cxv_detail::from_any ( \
306
- X)>())::value) { \
307
- return ::stdx::overload{ \
308
- ::stdx::cxv_detail::cx_base{}, [&] { \
309
- return ::stdx::type_identity< \
310
- decltype (::stdx::cxv_detail::type_of< \
311
- ::stdx::cxv_detail::from_any (X)>())>{}; \
312
- }}; \
313
- } else { \
314
- return ::stdx::overload{::stdx::cxv_detail::cx_base{}, f}; \
315
- } \
316
+ } else if constexpr (CX_DETECT (__VA_ARGS__)) { \
317
+ return ::stdx::overload{::stdx::cxv_detail::cx_base{}, f}; \
316
318
} else { \
317
319
return f (); \
318
320
} \
319
321
STDX_PRAGMA (diagnostic pop) \
320
322
}([&] { \
321
323
STDX_PRAGMA (diagnostic push) \
322
324
STDX_PRAGMA (diagnostic ignored " -Wold-style-cast" ) \
323
- return (X ) + ::stdx::cxv_detail::type_val{}; \
325
+ return (__VA_ARGS__ ) + ::stdx::cxv_detail::type_val{}; \
324
326
STDX_PRAGMA (diagnostic pop) \
325
327
})
326
328
0 commit comments