利用C++11的新特性来简化我们的print:
1. 递归,递归需要有一个终止条件,具体可以有以下几种方式:
1.1 普通递归
template<typename T>
void Print(T t)
{
cout << t << endl;
}
template<typename Head,typename ...Args>
void Print(Head head,Args... rest)
{
cout << head << endl;
Print(rest...);
}
1.2. 利用type_trias
template<size_t I = 0,typename Tup>
typename enable_if<I == tuple_size<Tup>::value>::type
Print(Tup t)
{
//do nothing
}
template<size_t I = 0,typename Tup>
typename enable_if<I < tuple_size<Tup>::value>::type
Print(Tup t)
{
cout << get<I>(t) << endl;
Print<I+1>(t);
}
template<typename ...Args>
PrintArgs(Args&&... args)
{
Print(make_tuple<Args...>(std::forword<Args>(args)...));
}
根据我分析,1.2会比1.1逼格稍微高点,但是1.2每次递归都会把所有参数都拷贝了一份。
2. 逗号表达式跟初始化列表结合
这个方式就省去了终止条件,更加简洁。
template<typename T>
void PrintArg(T t)
{
cout << t << endl;
}
template<typename... Args>
void Print(Args... args)
{
int a[] = {(PrintArg(args),0),...};
}