Распаковка вариативных кортежей в С++ 17

Есть ли что-нибудь лучше в С++ 17 (возможно, С++ 2a), чем классический способ С++ 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;
};

Например, выражение fold, структурированные привязки? Любой намек? Я могу принять ответ, почему я не могу использовать здесь упомянутые функции С++ 17, но я предпочитаю «solution.


person PiotrNycz    schedule 26.01.2018    source источник
comment
Кстати, какова цель назначения std::ignore? это документировать намерение?   -  person Massimiliano Janes    schedule 26.01.2018
comment
@MassimilianoJanes более или менее да   -  person PiotrNycz    schedule 26.01.2018


Ответы (1)


Начиная с C++14 у нас есть общие лямбда-выражения, а начиная с C++17 у нас есть выражения fold и std::apply, эффективно скрывающие обычную логику распаковки:

std::apply( [](auto&... i){ ((void)++i,...); }, some_tuple );

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

person Massimiliano Janes    schedule 26.01.2018
comment
красиво, но все же хак. Проголосовал, потому что это не ваша вина, что С++ не допускает прямого синтаксиса. - person bolov; 26.01.2018
comment
@bolov да, самая хакерская вещь - это необходимость использовать оператор запятой; Интересно, почему мы не можем просто expr;...; ... но я думаю, что это было бы проблематично с точки зрения грамматики - person Massimiliano Janes; 26.01.2018
comment
Можете применить ваше решение к моему примеру с приращением? Я имею в виду пример использования - person PiotrNycz; 26.01.2018
comment
@PiotrNycz да, просто замените вызов increment() на указанный выше, а some_tuple замените на член i - person Massimiliano Janes; 26.01.2018