#include <iostream>
#include <tuple>
#include <algorithm>
template <typename Tuple, typename Func, size_t ...N>
void apply_func_to_tuple(const Tuple &t, Func &&func, std::index_sequence<N...>) {
static_cast<void>(std::initializer_list<int>{(func(std::get<N>(t)), 0)...});
}
template <typename...Args, typename Func>
void travel_tuple(const std::tuple<Args...>&t, Func &&func) {
apply_func_to_tuple(t, std::forward<Func>(func), std::make_index_sequence<sizeof...(Args)>{});
}
int main() {
auto t = std::make_tuple(1, 10, "hello world.");
travel_tuple(t, [] (auto &&item) { std::cout << item << std::endl; });
return 0;
}
1.代码功能:
使用lambda表达式将tuple所有元素作为参数进行调用
2.代码分析:
1.std::index_sequence<N...>:告诉编译器,生成一个可变长度的下标列表
2.intializer_list<int>:初始化一个整型列表,在apply_func_to_tuple函数中使用逗号表达式初始化个所有值为0的列表
3.apply_func_to_tuple函数构造一个经过func调用后的所有值为0的列表
4.travel_tuple函数将tuple,func函数和参数个数传递给apply_func_to_tuple
5.make_index_sequence生成一个可变参数长度的列表
3.代码编译:
c++17环境:g++ -std=c++17 -g -o Test test.cpp