//可变参数模板
//可变参数模板,可以创建可接受可变数量参数的模板函数和模板类
//本程序通过模板函数来实例一下可变参数模板的基本用法
#include<iostream>
using namespace std;
void one(){}//当最后一个参数传完后,需要一个无参的重载版本
template <typename T>//当只剩最后一个参数时,编译器优先选择此模板,这样最后一个输出后面就没有逗号了
void one(T v)
{
cout << v << endl;
}
//...为元运算符
//F 是一个模板参数包,f 是一个函数参数包,T 与一种类型匹配,F 与 T 的区别是 F 与任意数量的类型匹配
//关键点是:模板参数包 F 要与 函数参数包 f, 无论是类型还是数量上,都要相匹配。
template <typename T, typename... F>
void one(T v, F... f) //每次从传的所有参数里面拿出一个来给 v,这样,就能递归完所有的传参
{
cout << v << ",";
one(f...); //将元运算符...放在 f 的右边,可以展开参数包,展开传给f的一系列参数
}
int main()
{
one("asd",1,2,3,4); //这一系列的参数传给模板函数包F,F再将参数包传给函数参数包f
return 0;
}
//可变参数模板,可以创建可接受可变数量参数的模板函数和模板类
//本程序通过模板函数来实例一下可变参数模板的基本用法
#include<iostream>
using namespace std;
void one(){}//当最后一个参数传完后,需要一个无参的重载版本
template <typename T>//当只剩最后一个参数时,编译器优先选择此模板,这样最后一个输出后面就没有逗号了
void one(T v)
{
cout << v << endl;
}
//...为元运算符
//F 是一个模板参数包,f 是一个函数参数包,T 与一种类型匹配,F 与 T 的区别是 F 与任意数量的类型匹配
//关键点是:模板参数包 F 要与 函数参数包 f, 无论是类型还是数量上,都要相匹配。
template <typename T, typename... F>
void one(T v, F... f) //每次从传的所有参数里面拿出一个来给 v,这样,就能递归完所有的传参
{
cout << v << ",";
one(f...); //将元运算符...放在 f 的右边,可以展开参数包,展开传给f的一系列参数
}
int main()
{
one("asd",1,2,3,4); //这一系列的参数传给模板函数包F,F再将参数包传给函数参数包f
return 0;
}