Как стать автором
Обновить

Комментарии 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>;

может не было буста…
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, макось.

Да, вы правы. С clang есть проблемы из-за overload resolution'а на данный момент.
Зарегистрируйтесь на Хабре , чтобы оставить комментарий