打印可变参数的个数:
template<class...Args>
void f(Args... args)
{
cout << sizeof...(args) << endl;
}
f(1); //1
f(1, 1.2); //2
f(1, 'c', 2); //3
递归展开参数包:
template<typename T>
void print(T t)
{
cout << "parameter:" << t << endl;
}
template<class T, class... Args>
void print(T head, Args... args)
{
cout << "parameter:" << head << endl;
print(args...);
}
print(1, 1.2, 'c'); //parameter:1
//parameter:1.2
//parameter:c
使用enable_if展开参数包
template<size_t I = 0, typename Tuple>
typename enable_if<I == tuple_size<Tuple>::value>::type print(Tuple t)
{
}
template<size_t I = 0, typename Tuple>
typename enable_if < I < tuple_size<Tuple>::value>::type print(Tuple t)
{
cout << get<I>(t) << endl;
print<I+1>(t);
}
template<typename... Args>
void print(Args... args)
{
print(make_tuple(args...));
}
print(1, 1.2, 'c'); //1
//1.2
//c
使用逗号表达式展开模板参数
template<class T>
void printarg(T t)
{
cout << t << endl;
}
template<class...Args>
void expand(Args...args)
{
int arr[] = { (printarg(args), 0)... };
}
template<class...Args>
void expand2(Args...args)
{
std::initializer_list<int>{(printarg(args), 0)...};
}
(printarg(args),0)先执行printarg(args),再得到逗号表达式的结果0。通过初始化列表来初始化一个变长数组,{(printarg(args), 0)...}将会展开成((printarg(arg1),0),(printarg(arg2),0),(printarg(arg3),0), etc...),最终会创建一个元素值都为0的数组int arr[sizeof...(Args)]。