Распаковка переменных-кортежей в 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 );

примечание: для вашего сведения, (пустота) состоит в том, чтобы просто избежать использования любого пользовательского оператора запятой... вы никогда не знаете:)

Другие вопросы по тегам