Распаковка переменных-кортежей в C++17
Есть ли что-нибудь лучше в C++17 (может быть, C++2a), чем классический C++14 способ распаковать переменную кортеж с std::index_sequence
?
Что-нибудь лучше, чем это:
template <typename ...I>
class MultiIterator
{
public:
MultiIterator(I const& ...i)
: i(i...)
{}
MultiIterator& operator ++()
{
increment(std::index_sequence_for<I...>{});
return *this;
}
private:
template <std::size_t ...C>
void increment(std::index_sequence<C...>)
{
std::ignore = std::make_tuple(++std::get<C>(i)...);
}
std::tuple<I...> i;
};
Как складное выражение, структурированные привязки? Любой намек? Я могу принять ответ, почему я не могу использовать эти упомянутые возможности C++ 17 здесь - но я предпочитаю "решение".
1 ответ
Решение
Начиная с C++14 у нас есть общие лямбда-выражения, а с C++17 у нас есть складные выражения и std::apply
эффективно скрываем обычную логику распаковки:
std::apply( [](auto&... i){ ((void)++i,...); }, some_tuple );
примечание: для вашего сведения, (пустота) состоит в том, чтобы просто избежать использования любого пользовательского оператора запятой... вы никогда не знаете:)