Variadic Templates

文章目录
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
#include <iostream>

// 处理无参数的情况
void printX() {
std::cout << std::endl;
}

// 任意参数类型
template<typename T, typename... Types>
void printX(const T& firstArg, const Types&... args) {
std::cout << firstArg << std::endl;
std::cout << "left:" << sizeof...(args) << "params" << " ";
// args 会被分为2部分 一部分是第一个参数 第二部分是args...
printX(args...);
}

// ... 是所谓的 pack
// 用于 template parameters 就是 template parameters pack
// 用于 function parameter types 就是 function parameter types pack
// 用于 function parameters 就是 function parameters pack

void printf(const char *s) {
while(*s) {
if(*s=='%'&&*(++s)!='%')
throw std::runtime_error("invalid format string");
std::cout << *s++;
}
}

//printf
template<typename T, typename... Args>
void printf(const char* s, T value, Args... args) {
while(*s) {
if(*s=='%'&&*(++s)!='%') {
std::cout << value;
printf(++s, args...);
return;
}
std::cout << *s++;
}
throw std::runtime_error("invalid format string");
}

int maximum(int n) {return n;}

template<typename...Args>
int maximum(int n, Args... args) {
return std::max(n, maximum(args...));
}

int main() {
printX(1,2,3,"asa");
std::cout << maximum(1,2,3,4) << std::endl;
}