资讯动态

可变参数模板的展开参数包

发布时间:2026/8/22 1:57:52 来源:尧图企业网站定制
templateclass ...Args void show(Args...args)//参数args前面有...,则他就是可变模板参数,称为参数包 { }展开参数包,去除参数包里的参数递归法:templateclass T void showlist(const T t)//当只剩最后一个元素是,剩余的参数包 //已经无法匹配,这个变为终止条件 { cout t endl; } templateclass T,class...Args void showlist(const T t, Args... args) { cout t endl;//每一次递归调用,都会打印第一个参数 //将余下的参数包传递 showlist(args...); }逗号法:templateclass ...Args void showlist(Args...args) { int arr[] { (print(args),0)... }; //逗号表达式,先执行第一个参数,返回第二个参数,数组内部都是参数0 //数组会强制触发参数包展开 //数组初始化列表会逐个处理每个参数,从而遍历参数包的所欲参数 /*for (auto e : arr) { cout e ; }*/ cout endl; }int main() { showlist(1, 2, 3, xxx); cout endl; showlist(2, 3, 4, yyy); /*vectorint v;*/ /*v.emplace_back(120);*/ return 0; }emplace接口原理:emplace利用可变参数模板 完美转发将构造对象所需的参数直接传递到容器的内存空间中就地调用对象的构造函数避免了临时对象的创建和拷贝 / 移动开销。容器预留内存容器如vector/list/unordered_map先在内部分配好要存放对象的内存地址比如vector的尾后空间。完美转发通过std::forward把传入emplace的参数原样包括左值 / 右值属性传递到目标内存位置。就地构造用new (地址) 类名(参数)的定位 new语法在指定内存地址直接调用构造函数创建对象。int main() { //核心区别 listpairint, string mylist; mylist.emplace_back(1, 11);//传不同的参数在内部直接去构造 mylist.push_back(make_pair(2, 22));//先构造,在拷贝传递,必须传特定的pair }

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价