练习16.53:
代码如下:
#include <iostream>
#include <vector>
#include <list>
#include <type_traits>
#include <typeinfo>
#include <algorithm>
#include <utility>
using namespace std;
//用来终止递归并打印最后一个元素
//此函数必须在可变参数版本的print定义之前声明
template<typename T>
ostream& print(ostream& os, const T& t)
{
return os << t;
}
template<typename T,typename... Args>
ostream& print(ostream& os, const T& t,const Args& ... rest)
{
//打印第一个实参
cout << t << " ";
//递归调用打印其他实参
return print(os, rest...);
}
int main()
{
int i = 10;
double d = 3.14;
string s = "hello";
char c = 'w';
print(cout, i);
cout << endl;
print(cout, d, s);
cout << endl;
print(cout, "hi", i, d, s, c);
cout << endl;
system("pause");
return 0;
}
结果如下:
练习16.54:
会发生编译错误,没有<<运算符的类型不能使用<<
练习16.55:
由于非可变参数版本需要作为可变参数版本的递归结束条件,但其声明不在作用域中,因此可变参数版本会一直递归调用自己,不会去调用非可变参数版本的print,产生编译错误