Комментарии 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 &, при передаче функторов и кортежей.
+4
Раз уж такая пьянка:
- Не учитываются пустые тюплы, нужно, для
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
+3
Буквально пару недель назад тоже понадобился foreach
для tuple
. Сделал на основе варианта со StackOverflow идеологически схожего с вашим. Но остался вопрос, почему ..., void()
, а не static_cast<void>(...)
? Вкусовщина или есть нюансы?
0
Что это за магия? Зачем надо использовать true и void() в initilizer_list ???
+1
Ну и, я думаю, стоило бы упомянуть C++ 17 fold expressionsСпасибо за ликбез, я как-то пропустил сию замечательную вещь.
0
если честно, не понял, зачем там void().
разве для составления unused (который по сути можно объявить как bool unused[] =) не достаточно будет только параметра true?
разве для составления unused (который по сути можно объявить как bool unused[] =) не достаточно будет только параметра true?
0
И лучше всё-таки использовать универсальные ссылки и forward, а не const &Соглашусь. Весьма небрежно с моей стороны.
0
Блин, какой же C++ уродливый… Я не хочу писать на таком языке. Я должен выкинуть свои 20 лет на попытки понять этот язык и перейти на что-нибудь другое. Я сдаюсь.
0
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Работа с кортежами С++ (std::tuple). Функции foreach, map и call