14 # if __has_include( <experimental/type_traits> )
15 # include <experimental/type_traits>
16 # define have_experimental_type_traits
23 #ifdef have_experimental_type_traits
25 template <
template <
class...>
class Op,
class... Args>
26 using is_detected =
typename std::experimental::is_detected<Op, Args...>;
28 template <
template <
class...>
class Op,
class... Args>
29 using detected_t =
typename std::experimental::detected_t<Op, Args...>;
31 template <
class Default,
template <
class...>
class Op,
class... Args>
32 using detected_or =
typename std::experimental::detected_or<Default, Op, Args...>;
38 template <
class Default,
class AlwaysVoid,
template <
class...>
class Op,
class... Args>
40 using value_t = std::false_type;
44 template <
class Default,
template <
class...>
class Op,
class... Args>
45 struct detector<Default, std::void_t<Op<Args...>>, Op, Args...> {
46 using value_t = std::true_type;
47 using type = Op<Args...>;
53 nonesuch( nonesuch
const& ) =
delete;
54 void operator=( nonesuch
const& ) =
delete;
57 template <
template <
class...>
class Op,
class... Args>
58 using is_detected =
typename detail::detector<nonesuch, void, Op, Args...>::value_t;
60 template <
template <
class...>
class Op,
class... Args>
61 using detected_t =
typename detail::detector<nonesuch, void, Op, Args...>::type;
63 template <
class Default,
template <
class...>
class Op,
class... Args>
64 using detected_or = detail::detector<Default, void, Op, Args...>;