32 template <
typename... Ts>
34 static constexpr std::size_t size =
sizeof...(Ts);
40 template <
template <
typename...>
typename List,
typename... Ts>
49 template <
typename List>
52 template <
template <
typename...>
typename List,
typename... Ts>
54 static constexpr std::size_t value =
sizeof...(Ts);
57 template <
typename List>
60 template <
typename List, std::
size_t I>
63 template <
template <
typename...>
typename List,
typename... Ts, std::size_t I>
64 struct at<List<Ts...>, I> {
65 using type = std::tuple_element_t<I, std::tuple<Ts...>>;
68 template <
typename List, std::
size_t I>
71 template <
typename List,
typename T>
74 template <
template <
typename...>
typename List,
typename... Ts,
typename T>
76 using type = List<Ts..., T>;
79 template <
typename List,
typename T>
82 template <type_list_like List,
typename Callable>
83 constexpr auto for_each_as_values(Callable&& handler) {
84 auto tuple = std::forward_as_tuple(std::forward<Callable>(handler));
87 [&]<
template <
typename...>
typename ConcreteList,
typename... Ts>(std::type_identity<ConcreteList<Ts...>>) {
88 return std::get<0>(std::move(tuple))(std::type_identity<Ts>{}...);
89 }(std::type_identity<List>{});
92 template <type_list_like List, auto Predicate>
94 static constexpr auto value = for_each_as_values<List>([]<
typename... Ts>(std::type_identity<Ts>...) {
96 std::size_t index{std::numeric_limits<std::size_t>::max()};
97 auto handler = [&, counter =
static_cast<std::size_t
>(0)]<
typename U>(std::type_identity<U>)
mutable {
98 if (!found && Predicate(std::type_identity<U>{})) {
106 return (handler(std::type_identity<Ts>{}), ..., index);
110 template <type_list_like List, auto Predicate>
113 template <type_list_like List, auto Predicate>
115 using type = at_t<List, index_if_v<List, Predicate>>;
118 template <type_list_like List, auto Predicate>
119 using at_if_t =
typename at_if<List, Predicate>::type;
Definition type_list.hpp:47
Definition type_list.hpp:72
Definition type_list.hpp:114
Definition type_list.hpp:61
Definition type_list.hpp:93
Definition type_list.hpp:38
Definition type_list.hpp:50
Definition type_list.hpp:33