1. 介绍
1.1
template<class …Args>
void foo(Args …args) {}
template<class …Args>
class bar {
public:
bar(Args …args) {
foo(args…);
}
};
class …Args是类型模板形参包,它可以接受零个或者多个类型的模板实参。Args …args叫作函数形参包,它出现在函数的形参列表中,可以接受零个或者多个函数实参。而args…是形参包展开,通常简称包展开。它将形参包展开为零个或者多个模式的列表,这个过程称为解包
1.2
变参函数模板,可以接受任意多个实参,编译器会根据实参的类型和个数推导出形参包的内容;
变参类模板需要指定;
#include <string>
template<class ...Args>
void foo(Args...args)
{}
template<class ...Args>
class bar {};
int main()
{
foo();
foo(1, 11.7);//变参函数模板无需指定类型
bar<int> b; //需要指定类型,否则编译报错
return 0;
}
template<int ...Args>
void foo(){}
这是非类型模板形参包
2. 形参包展开
允许包展开的场景包括以下几种:
- 1.表达式列表。
- 2.初始化列表
- 3.基类描述。
- 4.成员初始化列表。
- 5.函数参数列表。
- 6.模板参数列表。
- 7.动态异常列表(C++17已经不再使用)
- 8.lambda表达式捕获列表
- 9.Sizeof…运算符
- 10.对其运算符
-
- 属性列表