首页 C++系列20:index_sequence_for与index_sequence和make_index_sequence
文章
取消

C++系列20:index_sequence_for与index_sequence和make_index_sequence

每天学点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... 中的每个元素执行上述操作。

欢迎评论交流

本文由作者按照 CC BY 4.0 进行授权