Комментарии 5
Можно попробовать вместо итерирования по индексам, получения элемента кортежа по индексу, преобразования его в вариант и последующем посещением варианта, сразу посещать кортеж. Например, как-нибудь, так:
namespace details
{
template<typename Tuple, typename Func, size_t... I>
void visit(Tuple&& t, Func&& f, std::index_sequence<I...>)
{
(..., std::forward<Func>(f)(std::get<I>(std::forward<Tuple>(t))));
}
}
template<typename Tuple, typename Func>
void visit(Tuple&& t, Func&& f)
{
details::visit(std::forward<Tuple>(t), std::forward<Func>(f),
std::make_index_sequence<std::tuple_size_v<std::decay_t<Tuple>>>());
}
...
auto tuple = std::make_tuple(1, "5"s, 'c', 4.5f);
visit(tuple, [](auto& value) { std::cout << value << std::endl; });
Несложно добавить фильтрацию по индексам или другим критериям или генерировать отфильтрованный кортеж.
Как известно, кортеж представляет из себя гетерогенный список
Это не просто список, это список фиксированного размера, т.е. кортеж это обобщение std::pair
, а не std::list
. Т.е. непонятно зачем превращать кортеж и работать с ним как со списком std::variant
. Можно тогда сразу использовать std::array<std::variant<...>, N>
;
0
Если есть boost, то почему не взяли mp_with_index?
https://www.boost.org/doc/libs/1_75_0/libs/mp11/doc/html/mp11.html#mp_with_indexni_f
0
git clone https://github.com/AlexKiryushkin/rttg
cd rttg/examples
mkdir build && cd build && cmake ..
make
rttg/include/rttg/impl/invoke.h:59:54: error: call to object of type 'rttg::Overloader<(lambda at /Users/izvolov/prog/src/rttg/examples/access_individual_element.cpp:13:18),
rttg::detail::FallbackEmptyCallable<false> >' is ambiguous
[&compositeCallable](auto && value) { return compositeCallable(value.get()); },
^~~~~~~~~~~~~~~~~
Компилятор clang, макось.
0
Зарегистрируйтесь на Хабре , чтобы оставить комментарий
Доступ к элементам std::tuple во время исполнения программы