最近的C++语言标准有些更进一步的复杂特性,诸如加上了变长模板。我在尝试理解这个特性的过程中
的一个最大的问题是,没有足够简单的代码示例来说明到底变长模板是如何使用和起作用的。
以下是 我的一个基本样例来说明变长模板:
template <class ...A> int func(A... arg)
{
return sizeof...(arg);
}
int main(void)
{
return func (1,2,3,4,5,6);
}
首要介绍的是一些术语: 一个模板参数现在可以是一个模板参数包, <class...A>。一个模板参数包可以代表任意数量的
模板参数。在以上这个样例中,模板 <class...A>定义了func这个函数,他拥有任意数量的函数参数。函数参数(A... arg)即为
一个函数 参数包,他以一个参数的"形式"代表了模板template <class...A>参数包的每个成员。在这 个示例中,我们使用了6个参数来调用函数func。
模板参数推导(template argument deduction)会将参数 包<class...A>推导成为
<int,int,int,int,int,int>,接着函数参数包变成 (int,int,int,int,int,int),正好对应了6个传递过来的整形参数。
变长操作符sizeof...简单的返回了参 数包的参数个数(函数或者模板的),结果为6.
当然任何参数包多可以为空,考虑以下代码示 例:
template <class ...A> int func(A... arg)
{
return sizeof... (arg);
}
int main(void)
{
return func();
}
时间: 2024-12-03 04:02:22