7 namespace detail::_tuple_like {
9 void get(
auto&) =
delete;
11 void get(
const auto&) =
delete;
13 template <
class T,
class = std::make_index_sequence<std::tuple_size_v<T>>,
class =
void>
14 struct has_tuple_element : std::false_type {};
16 template <
class T, std::size_t... Idx>
17 struct has_tuple_element<T, std::index_sequence<Idx...>,
18 std::void_t<typename std::tuple_element<Idx, T>::type...>>
21 template <
class T,
class = std::make_index_sequence<std::tuple_size_v<T>>,
class =
void>
22 struct has_unqualified_get : std::false_type {};
24 template <
class T, std::size_t... Idx>
25 struct has_unqualified_get<T, std::index_sequence<Idx...>,
26 std::void_t<decltype(get<Idx>(std::declval<T>()))...>>
32 template <
class T,
class =
void>
37 struct is_tuple_like<T, std::void_t<decltype(std::tuple_size<T>::value)>>
38 :
_and<detail::_tuple_like::has_tuple_element<T>, detail::_tuple_like::has_unqualified_get<T>> {
47 concept tuple_like = is_tuple_like_v<std::remove_cvref_t<T>>;
Requires std::tuple_size, std::tuple_element and unqualified get is valid.
Definition: tuple_like.hpp:47
constexpr decltype(auto) get(single< T, Tag > &s)
get for single
Definition: single.hpp:176
std::conjunction< Bn... > _and
_and
Definition: stdfundamental.hpp:28
is_tuple_like
Definition: tuple_like.hpp:33
constexpr bool is_tuple_like_v
A helper inline variable for is_tuple_like.
Definition: tuple_like.hpp:43