mpc
Haskell-like feature supports in C++
tuple_like.hpp
Go to the documentation of this file.
1
2#pragma once
4
5namespace mpc {
7 namespace detail::_tuple_like {
8 template <auto>
9 void get(auto&) = delete;
10 template <auto>
11 void get(const auto&) = delete;
12
13 template <class T, class = std::make_index_sequence<std::tuple_size_v<T>>, class = void>
14 struct has_tuple_element : std::false_type {};
15
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...>>
19 : std::true_type {};
20
21 template <class T, class = std::make_index_sequence<std::tuple_size_v<T>>, class = void>
22 struct has_unqualified_get : std::false_type {};
23
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>()))...>>
27 : std::true_type {};
28 } // namespace detail::_tuple_like
30
32 template <class T, class = void>
33 struct is_tuple_like : std::false_type {};
34
36 template <class T>
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>> {
39 };
40
42 template <class T>
44
46 template <class T>
47 concept tuple_like = is_tuple_like_v<std::remove_cvref_t<T>>;
48} // namespace mpc
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