10 #ifndef NNLIB_TUPLE_UTILS_H
11 #define NNLIB_TUPLE_UTILS_H
21 template<
typename wantedType,
typename T>
24 template<
typename wantedType,
typename... Types>
27 static constexpr
bool wanted = (std::is_same_v<wantedType, Types> || ...);
36 template<
size_t i,
typename tuple_element_t,
typename wanted_element_t,
40 template<
typename tuple_type>
41 static auto doExtractType(
const tuple_type& t) {
42 return std::tuple<>{};
47 template<
size_t i,
typename tuple_element_t,
typename wanted_element_t>
48 struct ExtractType<i, tuple_element_t, wanted_element_t, true> {
50 template<
typename tuple_type>
51 static auto doExtractType(
const tuple_type& t) {
52 return std::tuple<tuple_element_t>{std::get<i>(t)};
59 template<
typename wanted_element_t,
typename tuple_type,
size_t... i>
60 auto getTypeT(
const tuple_type& t, std::index_sequence<i...>) {
61 return std::tuple_cat(
62 ExtractType<i,
typename std::tuple_element<i, tuple_type>::type, wanted_element_t>::doExtractType(t)...);
66 template<
typename... wanted_element_t,
typename... types>
67 auto getType(
const std::tuple<types...>& t) {
68 return getTypeT<std::tuple<wanted_element_t...>>(t, std::make_index_sequence<
sizeof...(types)>());
71 template<
class Tuple,
class T = std::decay_t<std::tuple_element_t<0, std::decay_t<Tuple>>>>
72 std::vector<T> toVector(Tuple&& tuple) {
73 return std::apply([](
auto&&... elems) {
return std::vector<T>{std::forward<decltype(elems)>(elems)...}; },
74 std::forward<Tuple>(tuple));
Definition: tuple_utils.h:22