网络用户提要求找人帮忙做的网站,wordpress全站伪静态,网站做多久能盈利,最新企业所得税优惠政策2023年目录
1、可变参数模板的用法
2、参数包展开
2.1 递归方式展开
2.2 逗号表达式形式展开
3、参数包的大小
结语 前言#xff1a; C11引入了可变参数模板#xff0c;他的作用是可以让创建的函数模板或者类模板的模板参数可以接收任意数量参数#xff0c;在C11前#x…
目录
1、可变参数模板的用法
2、参数包展开
2.1 递归方式展开
2.2 逗号表达式形式展开
3、参数包的大小
结语 前言 C11引入了可变参数模板他的作用是可以让创建的函数模板或者类模板的模板参数可以接收任意数量参数在C11前只能手写固定数量个模板参数并且只能接收与之对应数量的参数有了可变参数模板后代码就变得更加的灵活了。
1、可变参数模板的用法 可变参数必须是搭配着模板使用的具体写法如下
// Args是一个模板参数包args是一个函数形参参数包
// 声明一个参数包Args...args这个参数包中可以接收多个实参。
template class ...Args
void ShowList(Args... args)
{} 可以发现可变参数模板的写法非常特殊需要先创建一个模板并且该模板的参数需要用三个点’...‘来声明如上代码Args就成了一个模板参数包再用该模板参数去作为args的类型则args为函数形参参数包这一类args就可以接收多个实参了可接收0~n个参数n0。
2、参数包展开 虽然args可以接收多个参数但是无法直接读取这些参数的内容因此最重要的一步是将args参数包中的内容展开并读取到里面的数据这也是可变参数模板的一个难点——参数包的展开。
2.1 递归方式展开 采用类似于递归的方式进行参数包的展开注意调用参数包的写法具体代码如下
#define _CRT_SECURE_NO_WARNINGS 1#includeiostream
using namespace std;template class T
void ShowList(const T t)
{cout t endl;
}template class T, class ...Args
void ShowList(T value, Args... args)//函数重载
{//展开参数包cout value ;ShowList(args...);//当只剩下一个参数时会走第一个ShowList
}
int main()
{ShowList(1, A, string(hello world));return 0;
} 运行结果 具体流程如下图所示 2.2 逗号表达式形式展开 除了上述的递归方式还可以把参数包放到一个数组里 写法如下
#define _CRT_SECURE_NO_WARNINGS 1#includeiostream
using namespace std;template class T
void PrintArg(T t)
{cout t ;
}template class ...Args
void ShowList(Args... args)
{int arr[] { (PrintArg(args), 0)... };//特殊的写法cout endl;
}
int main()
{ShowList(1, A, hello world);return 0;
} 运行结果 具体过程{(printarg(args), 0)...}将会展开成((printarg(arg1),0), (printarg(arg2),0), (printarg(arg3),0), etc... )因为是逗号表达式所以先执行逗号前面的内容即(printarg(args)因此会先去调用函数printarg也就是说在构造arr数组的过程就将参数包展开了并且该数组arr的全部元素都是0因为逗号表达式的结果取最后一个该数组的大小是参数包的大小并且参数包中有多少个参数就有多少个元素0数组的最终结果应该是arr[sizeof...(args)] {0,0,0..}。
3、参数包的大小 参数包的大小即该参数包里总共有多少个参数与参数的类型无关只与个数有关示例代码如下
#define _CRT_SECURE_NO_WARNINGS 1#includeiostream
using namespace std;templateclass ...Args
void func(Args... args)
{cout __FUNCTION__ : sizeof...(args) endl;//注意求参数包的写法
}int main()
{func();//一个参数没有则参数包为0func(A, hello world);//两个参数参数包为2func(1,A,hello world);//三个参数参数包为3return 0;
}运行结果 此处注意计算参数包的写法。
结语 以上就是关于可变参数模板的讲解比如当我们不知道要传多少个参数给到模板时这类场景下就可以使用可变参数模板了该模板参数可以接收任意数量个参数然后再用特殊的写法将其内容展开就可以读取到参数包里的数据了。 最后希望本文可以给你带来更多的收获如果本文对你起到了帮助希望可以动动小指头帮忙点赞关注收藏如果有遗漏或者有误的地方欢迎大家在评论区补充谢谢大家