Хабр доступен 24/7 благодаря поддержке друзей

Комментарии 11
foreach, кстати, можно и короче сделать:
Но это уже для любителей.
И лучше всё-таки использовать универсальные ссылки и forward, а не const &, при передаче функторов и кортежей.
template <typename F, typename T, size_t... i>
void tupleForeachImpl(F&& f, T&& t, index_sequence<i...>) {
auto unused = { (f(get<i>(forward<T>(t))), true)... };
}
template <typename F, typename T>
void tupleForeach(F&& f, T&& t) {
tupleForeachImpl(forward<F>(f), forward<T>(t), make_index_sequence<tuple_size<typename decay<T>::type>::value>());
}
Но это уже для любителей.
И лучше всё-таки использовать универсальные ссылки и forward, а не const &, при передаче функторов и кортежей.
Раз уж такая пьянка:
- Не учитываются пустые тюплы, нужно, для
unused, хотя бы 1н элемент - Не учитывается перегруженный
operator,()для случая, когдаFвозвращает user-defined тип, для которого и определёнoperator,() - Раз уж C++ 14, тогда и
decay_t<T>вместоtypename decay<T>::type(tuple_size_vможно аналогично заюзать, но уже C++ 17) decay<T>— слишком жёстко, просто —remove_reference<T>
template <typename F, typename T, size_t... i>
void tupleForeachImpl(F&& f, T&& t, index_sequence<i...>) {
auto unused = { true, (f(get<i>(forward<T>(t))), void(), true)... };
}
template <typename F, typename T>
void tupleForeach(F&& f, T&& t) {
tupleForeachImpl(forward<F>(f), forward<T>(t), make_index_sequence<tuple_size<remove_reference_t<T>>::value>());
}Ну и, я думаю, стоило бы упомянуть C++ 17 fold expressions
Буквально пару недель назад тоже понадобился foreach для tuple. Сделал на основе варианта со StackOverflow идеологически схожего с вашим. Но остался вопрос, почему ..., void(), а не static_cast<void>(...)? Вкусовщина или есть нюансы?
Что это за магия? Зачем надо использовать true и void() в initilizer_list ???
Ну и, я думаю, стоило бы упомянуть C++ 17 fold expressionsСпасибо за ликбез, я как-то пропустил сию замечательную вещь.
если честно, не понял, зачем там void().
разве для составления unused (который по сути можно объявить как bool unused[] =) не достаточно будет только параметра true?
разве для составления unused (который по сути можно объявить как bool unused[] =) не достаточно будет только параметра true?
И лучше всё-таки использовать универсальные ссылки и forward, а не const &Соглашусь. Весьма небрежно с моей стороны.
Блин, какой же C++ уродливый… Я не хочу писать на таком языке. Я должен выкинуть свои 20 лет на попытки понять этот язык и перейти на что-нибудь другое. Я сдаюсь.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Работа с кортежами С++ (std::tuple). Функции foreach, map и call