18 #include <type_traits> 29 template<
typename... Ts>
33 template<
template<
class...>
class B,
class D>
36 static B<AA...>
test(B<AA...> *);
37 static void test(
void *);
39 using type = decltype(
test(static_cast<D *>(
nullptr)));
53 using voided = std::conditional_t<
false,
detail::hold<TT...>,
void>;
55 template<
template<
class...>
class B,
class D>
58 template<
template<
class...>
class B,
class D>
59 using base_specialization_t =
typename base_specialization<B, D>::type;
64 template<
typename T,
typename _ =
void>
72 voided<typename T::value_type,
73 typename T::size_type,
74 typename T::allocator_type,
76 typename T::const_iterator,
77 decltype(std::declval<T>().size()),
78 decltype(std::declval<T>().begin()),
79 decltype(std::declval<T>().end()),
80 decltype(std::declval<T>().cbegin()),
81 decltype(std::declval<T>().cend()),
82 decltype(std::declval<T>().data())>> :
public std::true_type {};
99 template<
typename T,
typename _ =
void>
107 voided<decltype(std::declval<T>().size()),
108 decltype(std::declval<T>().data())>> :
public std::true_type {};
125 template<
typename T,
typename _ =
void>
133 voided<decltype(std::declval<T>().begin()),
134 decltype(std::declval<T>().end())>> :
public std::true_type {};
int test(ARGS &&... args)
Definition: execution.hh:411
Definition: type_traits.hh:34
Definition: type_traits.hh:43
constexpr bool is_iterative_container_v
Equal to true if T is a container.
Definition: type_traits.hh:139
A Helper to identify if this is a container.
Definition: type_traits.hh:100
Definition: type_traits.hh:56
constexpr bool is_minimal_container_v
Equal to true if T is a container.
Definition: type_traits.hh:113
A Helper to identify if this is a container.
Definition: type_traits.hh:126
Definition: type_traits.hh:30
Check if a particular type T is a container.
Definition: type_traits.hh:65
constexpr bool is_container_v
Equal to true if T is a container.
Definition: type_traits.hh:87
Definition: control.hh:31