C++ Parameter Pack

可变参数函数模板通常是递归的。第一步调用处理包中的第一个实参,然后用剩余的实参调用自身。为了终止递归,我们还需要定义一个非可变参数的函数模板:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// template specialization
template <typename T>
void print(const T &t) {
std::cout << t;
}

// 包中除了最后一个元素的输出会调用上面的 `特化模板`,之外的其他元素都会调用这个版本的 print
template <typename T, typename...Args>
void print(const T &t, const Args&...rest) {
std::cout << t << " "; // 打印第一个实参
print(rest...); // 递归调用,打印其他实参
}

int main() {
print("string1", 2, 3.14f, "string2", 42);
std::cout << endl;
return 0;
}

Reference