#include<tuple>
#include<iostream>
#include<type_traits>
template<class... T>
void print(const std::tuple<T...>& _tup) {
[&] <class TupType, size_t... I>(const TupType & _tup, std::index_sequence<I...>) {
std::cout << "(";
(..., (std::cout << (I == 0 ? "" : ", ") << std::get<I>(_tup)));
std::cout << ")\n";
}(_tup, std::make_index_sequence<sizeof...(T)>());
}
int main() {
auto tp = std::make_tuple(1, 3.14, "Hello Word");
print(tp);
}
得益于std::index_sequence,折叠表达式,和C++20的带模板形参lambda,我们可以用仅仅这么点代码就遍历完成。如果想做除了打印的别的事情,可以写一个传函数的版本,如下
template<class F,class... T>
constexpr decltype(auto) for_each(F &&f,const std::tuple<T...>& _tup){
return [&] <class TupType, size_t... I>(TupType && _tup, std::index_sequence<I...>)
{
(..., f(std::get<I>(_tup)));
return f;
}(_tup , std::make_index_sequence<sizeof...(T)>());
}