每天学点C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
生成一个包含从 0 到 N-1 的整数序列的 std::index_sequence
在处理可变参数模板时,可以使用 std::index_sequence_for 来生成索引序列,从而展开参数包。
#include <iostream>
#include <tuple>
#include <utility>
// 打印 tuple 的辅助函数
template <typename Tuple, std::size_t... Is>
void printTuple(const Tuple& t, std::index_sequence<Is...>) {
((std::cout << (Is == 0 ? "" : ", ") << std::get<Is>(t)), ...);
std::cout << std::endl;
}
// 打印 tuple 的函数
template <typename... Args>
void printTuple(const std::tuple<Args...>& t) {
printTuple(t, std::index_sequence_for<Args...>{});
}
int main() {
auto t = std::make_tuple(1, 2.5, "Hello");
printTuple(t); // 输出: 1, 2.5, Hello
return 0;
}
调用带有多个参数的函数
#include <iostream>
#include <tuple>
#include <utility>
// 调用函数的辅助函数
template <typename Func, typename Tuple, std::size_t... Is>
auto callFunc(Func func, const Tuple& t, std::index_sequence<Is...>) {
return func(std::get<Is>(t)...);
}
// 调用函数的函数
template <typename Func, typename... Args>
auto callFunc(Func func, const std::tuple<Args...>& t) {
return callFunc(func, t, std::index_sequence_for<Args...>{});
}
// 示例函数
int add(int a, int b, int c) {
return a + b + c;
}
int main() {
auto t = std::make_tuple(1, 2, 3);
int result = callFunc(add, t); // 调用 add(1, 2, 3)
std::cout << "Result: " << result << std::endl; // 输出: Result: 6
return 0;
}
生成索引序列,用于访问数组或其他容器中的元素。
#include <iostream>
#include <utility>
// 打印数组的辅助函数
template <typename T, std::size_t... Is>
void printArray(const T& arr, std::index_sequence<Is...>) {
((std::cout << (Is == 0 ? "" : ", ") << arr[Is]), ...);
std::cout << std::endl;
}
// 打印数组的函数
template <typename T, std::size_t N>
void printArray(const T(&arr)[N]) {
printArray(arr, std::make_index_sequence<N>{});
}
int main() {
int arr[] = {1, 2, 3, 4, 5};
printArray(arr); // 输出: 1, 2, 3, 4, 5
return 0;
}
其中:
std::cout << (Is == 0 ? "" : ", ") << arr[Is] 将元素输出到标准输出流。
((std::cout << (Is == 0 ? "" : ", ") << arr[Is]), ...) 是一个逗号折叠表达式,它会对参数包 Is... 中的每个元素执行上述操作。
欢迎评论交流