Одновременный обход нескольких std::tuple
От: glmn  
Дата: 20.08.19 13:40
Оценка: :)
Есть задача одновременно обойти несколько std::tuple.

Для обхода одного std::tuple есть известный подход:

template <class Tuple, class F, std::size_t... I>
constexpr F for_each_impl(Tuple&& t, F&& f, std::index_sequence<I...>)
{
    return (void)std::initializer_list<int>{(std::forward<F>(f)(std::get<I>(std::forward<Tuple>}, f;
}

template <class Tuple, class F>
constexpr F for_each(Tuple&& t, F&& f)
{
    return for_each_impl(std::forward<Tuple>(t), std::forward<F>(f),
                         std::make_index_sequence<std::tuple_size<std::remove_reference_t<Tuple>>::value>{});
}


Пытаюсь переписать это дело под переменное количество std::tuple'ов одинаковой длины,
но не совсем понятно как правильно одновременно "распаковывать" sequence и tuple-аргумены (вообще возможно ли это?):

template <typename F, std::size_t... I, typename ...Tuples>
constexpr F for_each_variadic_impl(F&& f, std::index_sequence<I...>, Tuples&& ...tuples)
{
    return (void)std::initializer_list<int>{(std::forward<F>(f)(std::get<I>(std::forward<Tuples>(tuples))),0)...}, f;  // ошибка :)
}

template<typename Tuple1, typename... OtherTuples > 
struct tuple_size_helper
{
  static const std::size_t value = std::tuple_size<std::remove_reference_t<Tuple1>>::value;
};

template <typename F, typename ...Tuples>
constexpr F for_each_variadic(F&& f, Tuples&& ...tuples)
{
    return for_each_tuple_variadic_impl(
            std::forward<F>(f),
            std::make_index_sequence<tuple_size_helper<Tuples...>::value>{},
            std::forward<Tuples>(tuples)...);
}
Re: Одновременный обход нескольких std::tuple
От: vopl Россия  
Дата: 20.08.19 14:48
Оценка: 1 (1)
Здравствуйте, glmn, Вы писали:

G>Есть задача одновременно обойти несколько std::tuple.

G>...
G> но не совсем понятно как правильно одновременно "распаковывать" sequence и tuple-аргумены (вообще возможно ли это?):

http://ideone.com/fFGGqF
Re[2]: Одновременный обход нескольких std::tuple
От: watchmaker  
Дата: 20.08.19 15:22
Оценка: +1
Здравствуйте, vopl, Вы писали:
V>http://ideone.com/fFGGqF

Замечу, что и в исходном коде, и в этом (наверное из-за копипасты из исходного) есть ошибка с передачей std::forward<F>(f) там, где делать этого нельзя.
Если F — класс с ref-qualified member functions, то ошибка будет проявляться в выборе неподходящей функции с разрушительными последствиями.
Отредактировано 20.08.2019 15:22 watchmaker . Предыдущая версия .
Re: Одновременный обход нескольких std::tuple
От: slay93  
Дата: 20.08.19 18:30
Оценка:
Здравствуйте, glmn, Вы писали:

G>Есть задача одновременно обойти несколько std::tuple.

G>Пытаюсь переписать это дело под переменное количество std::tuple'ов одинаковой длины,
G> но не совсем понятно как правильно одновременно "распаковывать" sequence и tuple-аргумены (вообще возможно ли это?):
G>...

Вариант такой имеется https://codereview.stackexchange.com/questions/201106/iteration-over-zipped-tuples-for-each-in-tuples
Re: Одновременный обход нескольких std::tuple
От: Voivoid Россия  
Дата: 21.08.19 07:32
Оценка:
Здравствуйте, glmn, Вы писали:

G>Есть задача одновременно обойти несколько std::tuple.


пихай все std::tuple в другой std::tuple и обходи с помощью boost::fusion::for_each

можно еще в сторону boost::hana посмотреть
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.