[C++11]可变参数模板

发布时间:2026/8/30 13:07:19
[C++11]可变参数模板 ​嘿各位技术潮人好久不见甚是想念。生活就像一场奇妙冒险而编程就是那把超酷的万能钥匙。此刻阳光洒在键盘上灵感在指尖跳跃让我们抛开一切束缚给平淡日子加点料注入满满的passion。准备好和我一起冲进代码的奇幻宇宙了吗Let’s go我的博客yuanManGan我的专栏C入门小馆 C言雅韵集 数据结构漫游记 闲言碎语小记坊 进阶数据结构 走进Linux的世界 题山采玉 领略算法真谛C 114. 可变参数模板4.1 基本语法及原理什么是可变参数呢我们的printf函数就是一个可变参数函数我们可以向printf函数传入任意数量的参数,并且参数的类型可以不一样。这就是可变参数C11中支持可变参数模板也就是支持可变参数的函数模板和类模板可变数目的参数被称为参数包存在两种参数包模板参数包表示零或多个模板参数函数参数包表示零或多个函数参数。下面是可变参数模板的格式templateclass...ArgsvoidFuc(Args...args){}templateclass...ArgsvoidFuc(Args...args){}templateclass...ArgsvoidFuc(Args...args){}sizeof...用来计算参数包的个数。(编译时计算)4.2 包扩展我们可以使用参数包来写可变参数模板但这不是我们常用的方法。voidShowList(){coutendl;}templateclassT,class...ArgsvoidShowList(T x,Args...args){coutx ;ShowList(args...);}templateclass...Argsvoidprint(Args...args){ShowList(args...);//cout sizeof...(args) endl;//sizeof...编译时计算}本质是利用了递归。intmain(){doublea1.1;print();print(2);print(2,string(ssss));print(2,string(ssss),a);return0;}也可以这样写templateclassTintGetArg(constTx){coutx ;return0;}templateclass...ArgsvoidArguments(Args...args){}templateclass...ArgsvoidPrint(Args...args){// 注意GetArg必须返回或者到的对象这样才能组成参数包给Arguments// GetArg的返回值组成实参参数包传给ArgumentsArguments(GetArg(args)...);coutendl;}这两种方法了解一下就行了。4.3 empalce系列接口在STL中所有的函数都有一个emplace版本它们都说emplace版本效率更高那让我们来看看效率高在哪里呢intmain(){std::listbit::stringlt;//传左值bit::strings1(ssssssss);lt.push_back(s1);lt.emplace_back(s1);cout********************************************endl;//传右值、lt.push_back(move(s1));lt.emplace_back(move(s1));cout********************************************endl;return0;}我们发现传右值和左值它们的效率是一样的。我们如果直接传参就发现emplace版本只进行了一次构造就能完成这是为什么呢我们的push_back在创建类对象时就确定了T为string类型而emplace_back是直接推演的推演为const char*这个对象就可以直接构造string类型。我们再试试插入的是pair的对象。intmain(){std::listpairbit::string,intlt3;// 传左值效率用法都是一样的pairbit::string,intkv1(xxxxxx,1);lt3.push_back(kv1);lt3.emplace_back(kv1);cout*****************************************endl;// 传右值效率用法都是一样的pairbit::string,intkv2(xxxxxx,1);lt3.push_back(move(kv2));pairbit::string,intkv3(xxxxxx,1);lt3.emplace_back(move(kv3));cout*****************************************endl;// emplace_back的效率略高一筹lt3.push_back({11111111111111,1});//lt3.emplace_back({ 11111111111111, 1 }); //不支持lt3.emplace_back(11111111111111,1);cout*****************************************endl;return0;}​