C++11(可变参数模板,emplace系列接口)
文章目录可变参数模板参数包展开emplace接口可变参数模板c11支持可变参数模板可以自定义模板参数的数量可变数目的参数被称为参数包参数包分为模板参数包和函数参数包一个包可以包含0或多个参数可以通过sizeof…(args)来获取参数个数0个也是合法的不报错//class...Args表示模板参数包接收任意数量任意种类的参数类型比如intstring等//int ...Nums表示非类型模板参数包接收常量比如一堆整数templateclass...Args,int...Numsvoidfunc(Args...args)//Args...表示函数参数包用于存放所有收到的实参比如1张三等{coutsizeof...(args)endl;}templateclass...Argsvoidfunc1(Args...args){}//万能引用版本配合forward()实现完美转发intmain(){func(1);//1个参数func(1,2,3,abaaba)//多个不同类型参数参数包展开通过一个函数来递归展开参数包还需要定义一个递归终止函数voidshow_args(){//递归出口}templateclassT,class...Argsvoidshow_args(T val,Args...args){coutval ;//会自动将参数包里的第一个参数传给val并对val进行操作show_args(args...);//剩余参数打包为新的参数包继续递归拆解最后剩0个元素时会调用无函数的重载}//拆包过程会在编译时确定递归几次show(1,2,3,abc,3.14);emplace接口C11之后STL容器都新增了emplace系列接口均为模板可变参数功能上兼容push系列和insert系列还支持直接输入构造被容纳类型的参数在容器空间中直接构造对象emplace总体而言是更高效的推荐可以代替insert和push系列vectorstringv;v.push_back(hello);//push先造临时string再移动/拷贝进容器v.emplace_back(hello);//emplace传构造参数在尾部直接构造无临时对象v.insert(v.end(),string(hello));//insert插入完整对象v.emplace(v.end(),hello);//emplace传构造参数在迭代器处就地构造v.emplace_back({hello})//会先使用花括号初始化构造string再将string插入v效率并没有提升