在 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)>{});
}
您可以使用 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...>());
}
我们要使用的是forEach
(forEachImpl
只是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);
}
我正在尝试在元组中打印 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)>{});
}
您可以使用 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...>());
}
我们要使用的是forEach
(forEachImpl
只是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);
}