Th4.7:可变参模板
本小节回顾的知识点分别是可变参模板。
今天总结的知识分为以下3个大点:
(1)可变惨模板概念
(2)可变参函数模板
(2.1)简单范例
(2.2)参数包的展开
(3)可变参类模板
(3.1)通过递归继承方式展开参数包
(1)可变参的模板:
在前面的学习coding中,我们接触到的all模板,其参数数量和类型是固定的。但在C++11中,引入了可变参数(数量和类型都可多变)的模板的概念。
可变参数(数量Nums和类型Type都可多变)的模板(Variable Parameter Template):允许模板中含有>=0个模板参数,在语法上与传统的模板是不一样的(多了个...)
(2)可变参函数模板:
格式:
template<typename...T>
retName templateFuncName(T...vars){//...
}
注意:一般我们都把这个vars称之为一包形参或者一堆形参,参数的个数和类型都可以不相同!
注意:在理解...T这种模板可变参类型(一包类型/一堆类型)时,不能把它理解为1个类型,而要理解为0到多个(不同/相同)的类型。
(2.1)简单范例:
废话不多说,请看以下代码:
template<typename... T>
void mytfunc(T... var) {cout << "sizeof...(var) = " << sizeof...(var) << endl;//sizeof...(var)表示:返回可变参模板的模板参数的个数!
}
int main(void) {mytfunc();//0个参数mytfunc(1, 2, 3);//3个参数mytfunc("lzf",'a',1.88,1);//4个参数return 0;
}
运行结果:
再比如:
template<typename T,typename...U>
void tfuncc(const T& tt,const U &...vars) {cout << "sizeof...(var) = " << sizeof...(vars) << endl;
}
int main(void) {tfuncc(6);//可变参数有0个,sizeof...(var) = 0tfuncc(1, "lzf", 'a', 388.8, 8);//可变参数有4个,sizeof...(var) = 4return 0;
}
运行结果:
再比如:
template<typename T,typename...U>
void tfuncc(const T& tt,const U&& ...vars) {cout << "sizeof...(var) = " << sizeof...(vars) << endl;
}
int main(void) {//用std::move(var)函数可将变量var(左值)变成一个右值!tfuncc(1, std::move("lzf"), std::move('a'), std::move(388.8), std::move(8));//sizeof...(var) = 4return 0;
}
运行结果:
注意:(从以上2个小例子可见)在具体的函数形参中,当需要用到引用符号(不论是左值&/右值引用&&)时,都需要直接写在可变参类型名之后再加上三个点...。也即:
const U &...vars
const U &&...vars
(2.2)参数包的展开:
既然我可以输入任意个数和类型的参数,那是否有办法让我们知道我们输入的一包/一堆参数vars的个数是多少,类型是什么呢?答:显然,是有点!
How?:
参数包vars的展开套路():一般是比较固定地用递归的思想来展开参数
(当然,还有别的方式,这里只介绍一种递归的展开方式,日后工作coding中我们若有用到别的方式,可通过看书进一步学习哈~)
这就要求我们在编写参数包展开代码时定义2个函数:
①一个想do参数包展开的可变参模板函数
②一个与上述可变参模板函数同名的递归终止函数
注意:若你想展开可变参模板函数的一包/一堆参数,建议(推荐)你这么写可变参模板函数:
(把可变参数写在一个普通模板参数的后面,也即:一个模板参数+一包/一堆可变参数的形式)
template<typename T,typename...U>
retName varTemplateFuncName(const T& tt,const U&...vars){//...
}
请看以下代码:
//一个与可变参模板函数同名的递归终止函数
void tfuncc() {cout << "参数包展开时执行了递归终止函数tfuncc()!" << endl;
}
//一个想do参数包展开的可变参模板函数
template<typename T,typename...U>
void tfuncc(const T& tt,const U& ...vars) {//cout << "sizeof...(var) = " << sizeof...(vars) << endl;cout << "收到的参数值为:" << tt << endl;tfuncc(vars...);
}
int main(void) {tfuncc("lzf",'a',1.88,1);return 0;
}
运行结果:
(3)可变参类模板(有点复杂并难理解,了解一下即可):
可变参类模板:允许模板形参表中含有>=0个模板参数的类模板。
(3.1)通过递归继承的方式展开参数包:
请看以下代码:
template<typename...Args> class mytClass {};//主模板定义
template<typename First,typename... vars>
class mytClass<First, vars...> :private mytClass<vars...>
{public:First m_i;mytClass() :m_i(0) {cout << "mytClass::mytClass()执行力!this = " << this << endl;}mytClass(First parf,vars...pvars) :m_i(parf) ,mytClass<vars...>(pvars) {cout << "-----------------begin---------------" << endl;cout << "mytClass::mytClass()执行力!this = " << this << endl;cout << "-----------------end---------------" << endl;}
};
int main(void) {mytClass<int, float, double> myc(12,13.5f,23.8);return 0;
}
这里我并没有给出运行结果,因为在VS2022上执行不了,具体原因我目前还没搞懂,so先暂时放着,因为这块知识点算是Cpp中高级的知识,且非常少用,日后coding中用到了再补回来~
以上就是我总结的关于可变参模板的笔记。希望你能读懂并且消化完,也希望自己能牢记这些小小的细节知识点,加油吧,我们都在coding的路上~
Th4.7:可变参模板相关推荐
- 变参模板、完美转发和emplace
文章目录 1 变参模板.完美转发和emplace 1 变参模板.完美转发和emplace 变参模板:使得 emplace 可以接受任意参数,这样就可以适用于任意对象的构建. 完美转发 :使得接收下来的 ...
- C++11 变参模板
文章目录 1.概述 2.可变模版参数的展开 2.1变参函数模版 2.1.1递归函数方式展开参数包 2.1.2逗号表达式展开参数包 2.2变参类模版 2.2.1偏特化与递归方式展开 2.2.2继承方式展 ...
- 可变参C API va_list,va_start,va_arg_va_end以及c++可变参模板
文章目录 C变参API C变参API函数原型 C变参API实现源码 C变参API应用实例 C 变参函数缺点 C++变参实现 方法 initializer_list 形参 可变参数模板 C变参API C ...
- 902-基于可变参模板实现的线程池架构和使用方式
项目设计 用户的初始化操作如下: 用户提交任务的操作如下: 用户获取任务执行的结果操作如下:
- 编程实现算术表达式求值_用魔法打败魔法:C++模板元编程实现的scheme元循环求值器...
本文使用 Zhihu On VSCode 创作并发布 [TOC] 前言 寒假时沉迷C++模板元编程,写了个简单的Scheme元循环求值器.可以用类似Scheme的语法写出这样的C++模板代码: _&l ...
- C++11新特性之变长参数模板详解
本文主要介绍了C++11变长参数模板,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧 目录 C++11 变长参数模板 变长函数参数 ...
- C++设计模式由浅入深(二)—— 类模板和函数模板
二.类和函数模板 C++的模板编程特性是一个又大又复杂的话题,有许多著作专门传授这种特性和技巧.在本书中,我们会用到许多C++中的高级泛型编程特性.那么我们该如何去理解贯穿次数中的这些语言结构呢?本章 ...
- c++新特性之模板 对象
目录 模板 外部模板 尖括号 类别名 默认模板参数 变长参数模板 解包 折叠表达式 面向对象 委托构造 继承构造 显式禁用默认函数 强枚举类型 模板 C++ 的模板一直是这门语言的一种特殊的艺术,模板 ...
- C++ 实验 5.12
程序:变参模板输出多种类型参数 主要涉及右值引用,移动语义 可参考:右值引用....等等 先上代码: #include <iostream> #include <string> ...
最新文章
- MindSpore技术理解(下)
- 列名无效怎么解决_PowerQuery批量合并Excel,前面有空行且不相等的解决办法
- python读中文文本_python读取中文txt文本
- 【BZOJ2117】 [2010国家集训队]Crash的旅游计划
- layui table 分页 记住之前勾选的数据
- 《游戏编程模式》读书笔记之一
- 代谢组学的相关分析数据库,MetaboAnalyst 5.0 使用指南
- jhipster 配置 mysql_java – 将jhipster后端和前端分成两个项目?
- python修改服务器ip,[python+Bat]读表修改机房IP
- docker hub push_Docker系列-(2) 镜像制作与发布
- 年度盘点 | 2016年中国云计算十大新闻
- 特斯拉和SolarCity推出太阳能屋顶瓦片
- windows 7 下安装Oracle 9i 解决方法
- 远程连接服务器的命令工具,windows系统如何实现远程命令?远程命令工具您选哪个?...
- Win7 环境下 IE8 升级到 IE11 后 F12 工具无法使用
- 多项式承诺Polynomial commitment方案汇总
- clustMD r语言_R语言做聚类分析Kmeans时确定类的个数
- C语言练习之输入x输出y
- 求两个字符串的最大连续公共字串
- 计算机模拟需要什么配置电脑,城市天际线配置要求 最低电脑配置要求