Умеет ли tuple работать в цикле

364
06 августа 2021, 03:50

Необходимо пройти по всему кортежу и выводить результат каждого прохода. В итоге работы программы на экран должны быть выведены все элементы кортежа. Вот так я пытаюсь делать:

#include <iostream>
#include <tuple>
using namespace std;
int main()
{
    tuple<int, char, double> some(32, 10, 33.5); //10 это перенос строки, чтобы числа не сливались.
    for (int i=0;i<2;i++){
        cout << get<i>(some);
}
return 0;

}
Но получаю ошибку:
no matching function for call to 'get'
Неужели область видимости виновата? Как еще можно реализовать цикл с элементами кортежа?
вывод который ожидаю

32
33.5
Answer 1

Простой цикл не работает так как параметр для функции std::get должен быть константой времени компиляции. В С++17 с использованием generic lambda, fold expression и оператора запятой можно сделать так:

#include <iostream>
#include <tuple>
int main()
{
    ::std::tuple<int, char, double> some{32, 'w', 33.5};
    ::std::apply([](auto &... x){(..., static_cast<void>(::std::cout << x << ::std::endl));}, some);
    return 0;
}
Answer 2

Решение без использования fold expression.

#include <iostream>
#include <tuple>
template <size_t First, size_t Last>
struct tuple_index
{
};
template <size_t Last,
    typename Func,
    typename... Types>
void for_n_tuple(Func&& func, const std::tuple<Types...>& tuple, tuple_index<Last, Last>)
{
    func(std::get<Last>(tuple));
}
template <size_t First, size_t Last,
    typename Func,
    typename... Types>
void for_n_tuple(Func&& func, const std::tuple<Types...>& tuple, tuple_index<First, Last>)
{
    func(std::get<First>(tuple));
    for_n_tuple(std::forward<Func>(func), tuple, tuple_index<First + 1, Last>{});
}
template <size_t First, size_t Last,
    typename Func,
    typename... Types>
void for_tuple(Func&& func, const std::tuple<Types...>& tuple)
{
    for_n_tuple(std::forward<Func>(func), tuple, tuple_index<First, Last>{});
}
int main()
{
    auto tuple = std::make_tuple(12, "hello", 13);
    for_tuple<0, 1>([](auto&& item) {
        std::cout << item << "\n";
    }, tuple);
}

C++14. https://wandbox.org/permlink/8Fpx3o4PeG1NuUcX

READ ALSO
Ошибка C4700 VS 2019

Ошибка C4700 VS 2019

Ошибка Severity Code Description Project File Line Suppression State Error C4700 uninitialized local variable 'tmp_double_vector' used isdt Isodatacpp 186

150
Существует ли в C++ макрос с именем класса?

Существует ли в C++ макрос с именем класса?

Пишу самописный модуль для ведения журнала работы программыДля упрощения последующего анализа логов хочу сделать разбивку сообщений по группам/модулям,...

164
No matching function to call to std::swap - std::swap и QCharRef

No matching function to call to std::swap - std::swap и QCharRef

Нужно поменять местами последний и предпоследний символы QStringРешил делать через std::swap():

381