C++可变参数的函数与模板实例分析(2)
可变参数函数模板通常是递归的。第一步调用处理包中的第一个实参,然后用剩余的实参调用自身。为了终止递归,我们还需要定义一个非可变参数的函数
可变参数函数模板通常是递归的。第一步调用处理包中的第一个实参,然后用剩余的实参调用自身。为了终止递归,我们还需要定义一个非可变参数的函数模板:
// 用来终止递归并处理包中最后一个元素
template <typename T>
void print(const T &t)
{
cout << t;
}
// 包中除了最后一个元素之外的其他元素都会调用这个版本的print
template <typename T, typename...Args>
void print(const T &t, const Args&...rest)
{
cout << t << " "; // 打印第一个实参
print(rest...); // 递归调用,打印其他实参
}
// 测试
int main()
{
print("string1", 2, 3.14f, "string2", 42);
cout << endl;
return 0;
}
非可变参数版本的print负责终止递归并打印初始调用中的最后一个实参。对于最后一次递归调用print(42),两个print版本都是可行的。但是,非可变参数模板比可变参数模板更特例化,因此编译器选择非可变参数版本。
精彩图集
精彩文章





