在 C++ 中打印元组内的对

Printing Pairs inside tuple in C++

我正在尝试在元组中打印 pair 的所有值,

头文件

template <typename... Args>
void printPairs(std::tuple<Args...> t)
{
    for (int i = 0; i <= 4; i++)  //the value of 'i' is not usable in a constant expression
    {
        auto pair = std::get<i>(t);
        cout << pair.first << " " << pair.second << endl;
    }
}

Main.cpp

std::tuple<std::pair<int, int>, std::pair<int, int>, std::pair<int, int>, std::pair<int, int>> t1 = {std::make_pair(1, 2), std::make_pair(3, 4), std::make_pair(5, 6), std::make_pair(7, 8)};
printPairs(t1);

如果您不进行迭代并使用常量值代替“i”,效果很好

auto pair = std::get<1>(t);
 cout << pair.first << " " << pair.second << endl;

大概是这样的:

template <typename... Args, size_t... Is>
void printPairsHelper(const std::tuple<Args...>& t, std::index_sequence<Is...>) {
    ((std::cout << std::get<Is>(t).first << " "
                << std::get<Is>(t).second << std::endl), ...);
}

template <typename... Args>
void printPairs(const std::tuple<Args...>& t)
{
    printPairsHelper(t, std::make_index_sequence<sizeof...(Args)>{});
}

Demo

您可以使用 std::apply:

template<typename Tuple>
void printPairs(const Tuple& t) {
  std::apply([](const auto&... pair) {
    ((std::cout << pair.first << " " << pair.second << std::endl), ...);
  }, t);
}

无法在循环中打印元组的元素,因为正如其中一条评论中已经解释的那样,循环(for、while 等)在 run-time 处求值并迭代在元组之上,你需要在 compile-time.

上工作的东西

我看到的一个解决方案是首先编写一个小的实用函数:

#include <tuple>
#include <utility>

template<std::size_t... Ints, typename... Args, typename Proc>
void forEachImpl(std::tuple<Args...> const& tuple, Proc&& proc, std::index_sequence<Ints...>) {
    (..., proc(std::get<Ints>(tuple)));
}

template<typename... Args, typename Proc>
void forEach(std::tuple<Args...> const& tuple, Proc&& proc) {
    forEachImpl(tuple, proc, std::index_sequence_for<Args...>());
}

我们要使用的是forEachforEachImpl只是forEach使用的一个实现辅助函数)。它所做的是,它调用 proc 并将元组的每个元素作为参数。

然后我们可以回到您的函数 - printPairs - 和主要函数:

#include <iostream>

template<typename... Args>
void printPairs(std::tuple<Args...> const& tuple) {
    forEach(tuple, [] (auto const& pair) {
        std::cout << pair.first << ' ' << pair.second << '\n';
    });
}

int main() {
    std::tuple t(std::pair(1, 3), std::pair('x', 'y'), std::pair(-5.3f, 3.7L));
    printPairs(t);
}