本小节回顾的知识点分别是可变参模板

今天总结的知识分为以下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:可变参模板相关推荐

  1. 变参模板、完美转发和emplace

    文章目录 1 变参模板.完美转发和emplace 1 变参模板.完美转发和emplace 变参模板:使得 emplace 可以接受任意参数,这样就可以适用于任意对象的构建. 完美转发 :使得接收下来的 ...

  2. C++11 变参模板

    文章目录 1.概述 2.可变模版参数的展开 2.1变参函数模版 2.1.1递归函数方式展开参数包 2.1.2逗号表达式展开参数包 2.2变参类模版 2.2.1偏特化与递归方式展开 2.2.2继承方式展 ...

  3. 可变参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 ...

  4. 902-基于可变参模板实现的线程池架构和使用方式

    项目设计 用户的初始化操作如下: 用户提交任务的操作如下: 用户获取任务执行的结果操作如下:

  5. 编程实现算术表达式求值_用魔法打败魔法:C++模板元编程实现的scheme元循环求值器...

    本文使用 Zhihu On VSCode 创作并发布 [TOC] 前言 寒假时沉迷C++模板元编程,写了个简单的Scheme元循环求值器.可以用类似Scheme的语法写出这样的C++模板代码: _&l ...

  6. C++11新特性之变长参数模板详解

    本文主要介绍了C++11变长参数模板,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧 目录 C++11 变长参数模板 变长函数参数 ...

  7. C++设计模式由浅入深(二)—— 类模板和函数模板

    二.类和函数模板 C++的模板编程特性是一个又大又复杂的话题,有许多著作专门传授这种特性和技巧.在本书中,我们会用到许多C++中的高级泛型编程特性.那么我们该如何去理解贯穿次数中的这些语言结构呢?本章 ...

  8. c++新特性之模板 对象

    目录 模板 外部模板 尖括号 类别名 默认模板参数 变长参数模板 解包 折叠表达式 面向对象 委托构造 继承构造 显式禁用默认函数 强枚举类型 模板 C++ 的模板一直是这门语言的一种特殊的艺术,模板 ...

  9. C++ 实验 5.12

    程序:变参模板输出多种类型参数  主要涉及右值引用,移动语义 可参考:右值引用....等等 先上代码: #include <iostream> #include <string> ...

最新文章

  1. MindSpore技术理解(下)
  2. 列名无效怎么解决_PowerQuery批量合并Excel,前面有空行且不相等的解决办法
  3. python读中文文本_python读取中文txt文本
  4. 【BZOJ2117】 [2010国家集训队]Crash的旅游计划
  5. layui table 分页 记住之前勾选的数据
  6. 《游戏编程模式》读书笔记之一
  7. 代谢组学的相关分析数据库,MetaboAnalyst 5.0 使用指南
  8. jhipster 配置 mysql_java – 将jhipster后端和前端分成两个项目?
  9. python修改服务器ip,[python+Bat]读表修改机房IP
  10. docker hub push_Docker系列-(2) 镜像制作与发布
  11. 年度盘点 | 2016年中国云计算十大新闻
  12. 特斯拉和SolarCity推出太阳能屋顶瓦片
  13. windows 7 下安装Oracle 9i 解决方法
  14. 远程连接服务器的命令工具,windows系统如何实现远程命令?远程命令工具您选哪个?...
  15. Win7 环境下 IE8 升级到 IE11 后 F12 工具无法使用
  16. 多项式承诺Polynomial commitment方案汇总
  17. clustMD r语言_R语言做聚类分析Kmeans时确定类的个数
  18. C语言练习之输入x输出y
  19. 求两个字符串的最大连续公共字串
  20. 计算机模拟需要什么配置电脑,城市天际线配置要求 最低电脑配置要求

热门文章

  1. sentinel教程
  2. JavaScript基础 ( 3 章 )
  3. 基于jsp+mysql+Spring+mybatis的SSM学生兼职项目网站
  4. 人生,还没困难到非死不可
  5. 微信小程序中通过获取的经纬度值获取该地点所在城市信息
  6. 【JavaScript】基本语法大全
  7. python 百度网盘 群组 文件_py实现百度云批量生成文件共享链接
  8. Rational RUP 介绍
  9. 【强化学习高阶技巧】Experience Replay经验回报
  10. useRef的基本用法