可变参模板

目录

概述

可变参函数模板

可变参类模板


概述

可变参模板是C++11引入的一个功能强大的特性。英文名是Variadic Templates。其允许我们定义参数数量可变的模板函数和模板类,更加的提高了编写的灵活性和通用性。在可变参数模板中,参数的数量在编译时才会确定。这种机制多用于元组操作、函数封装、递归模板等需要处理不确定参数数量的场景。

可变参函数模板

定义可变参数模板使用参数包: ...  ,表示接受可变数量的参数,参数包可以分为类型参数包和非类型参数包两种。通常将此方法定义的参数叫做一包参数,代表零个到多个参数。 

template<class... T>//类型模板参数,T叫做可变参类型
void Func(T... args)
{cout<<sizeof...(args)<<endl;//输出可变参数目
}Func(10,5,7,"abc");//可变参函数模板的调用template<int... a>//非类型模板参数
void Func2(a)
{int total=(...+a);//使用折叠表达式计算参数包中所有值的和cout<<"Sum="<<total<<endl;
}Func2(1,2,3,4,5,6,7,8,10);//可变参函数模板的调用

我们可以通过递归的方法展开参数包,将参数包中的参数一一分开。方便起见,我们定义可变参函数模板一般将模板参数设为一个参数和一个参数包,这样展开较为便捷。

template<class... T,class R>
void Func(R& a,const T&... b)
{cout<<a<<endl;Func(b...);
}void Func()//终止函数
{cout<<"递归终止函数"<<endl;
}

可变参类模板

和可变参函数模板一样,可变参类模板同样支持将一包参数作为模板参数。一包参数的参数个数范围亦为零个到多个。但展开方式与可变参函数模板不尽相同,相比之下较为复杂。

template<class... T> class A{};//递归继承方式参开参数包
template<class Firstone,class... Others>
class A<Firstone,Others...> : private A<Others...>
{
public:A() :a(0){cout<<a<<endl;}A(Firstone m,Others n) :a(m),A(n...){cout<<a<<endl;}Firstone a;
};

 组合关系和继承关系都是面向对象编程的重要概念。组合关系即一个类包含另一个类对象。

//递归组合方式展开参数包
template<class Firstone,class... Others>
class A
{
public:A :a(0){cout<<a<<endl;}A(Firstone m,Others n) :a(m),ab(n...){cout<<a<<endl;}
public:
Firstone a;
A<Others...> ab;
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/809355.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ssm+vue的实验室课程管理系统(有报告)。Javaee项目,ssm vue前后端分离项目。

演示视频&#xff1a; ssmvue的实验室课程管理系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;ssm vue前后端分离项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构…

RabbitMQ消息模型之Simple消息模型

simple消息模型 生产者 package com.example.demo02.mq.simple;import com.example.demo02.mq.util.ConnectionUtils; import com.rabbitmq.client.Channel; import com.rabbitmq.client.Connection;import java.io.IOException;/*** author Allen* 4/10/2024 8:07 PM* versi…

绝地求生:AUG爆裂弹球黑货箱:街机动漫风格大家会喜欢吗?

大好&#xff0c;我闲游盒&#xff01; 4.10更新后&#xff0c;AUG的新成长型也出来了&#xff0c;更新后我觉得AUG变好用了一点&#xff0c;不知道大家有没有感觉出来&#xff1f; 宝箱概率 本期主角 AUG-爆裂弹球&#xff08;紫色配粉红色&#xff09; 本次的AUG我才升到5级…

从 SQLite 3.4.2 迁移到 3.5.0(二十)

返回&#xff1a;SQLite—系列文章目录 上一篇:SQLite---调试提示&#xff08;十九&#xff09; 下一篇&#xff1a;SQLite—系列文章目录 ​ SQLite 版本 3.5.0 &#xff08;2007-09-04&#xff09; 引入了一个新的操作系统接口层&#xff0c; 与所有先前版本的 SQLi…

通过WebShell登录SQL Server主机并使用SSRS报表服务

背景信息 RDS SQL Server提供了WebShell功能&#xff0c;允许用户通过Web界面登录到RDS SQL Server实例的操作系统中&#xff0c;并在该操作系统中执行命令、上传下载文件等操作。WebShell功能方便用户对RDS SQL Server实例的管理和维护&#xff0c;特别是在无法使用SSH客户端的…

angular版本升级成16后css的踩坑

angualr版本升级16后&#xff0c;angualr项目打包后会把 left: 0; top: 0; right: 0; bottom: 0; 转换为inset&#xff1a;0&#xff0c; safir14.5以下的浏览器识别不了inset&#xff1a;0这个样式导致css样式失效。页面出现问题。 后面我特地学习了inset属性。 inset 是一…

社交网络的未来图景:探索Facebook的发展趋势

随着科技的不断进步和社会的快速变迁&#xff0c;社交网络作为连接人与人之间的重要纽带&#xff0c;扮演着日益重要的角色。而在众多社交网络中&#xff0c;Facebook作为老牌巨头&#xff0c;一直在探索着新的发展路径&#xff0c;引领着社交网络的未来图景。本文将深入探索Fa…

SQLite---调试提示(十九)

返回&#xff1a;SQLite—系列文章目录 上一篇:SQLite Android 绑定&#xff08;十八&#xff09; 下一篇&#xff1a;从 SQLite 3.4.2 迁移到 3.5.0&#xff08;二十&#xff09; ​ 以下是 SQLite 开发人员跟踪、检查和了解 核心 SQLite 库。 这些技术旨在帮助理解 核…

open c UF_MODL_create_simple_hole 识别放置平面 UF_MODL_ask_face_data

在BLOCK上创建一个简单孔 UF_FEATURE_SIGN sign UF_NULLSIGN;double block_orig[3] { -25.0,-25.0,0.0 };char* block_len[3] { "50","50","30" };tag_t blk_obj;UF_MODL_create_block1(sign, block_orig, block_len, &blk_obj);tag_t bo…

ubuntu如何截图? ubuntu中截屏的三种方法

文章目录 1.ubuntu主要用途2.ubuntu如何截图&#xff1f;2.1 方法一&#xff1a;键盘按键快捷键截屏 2.2 方法二&#xff1a;系统自带软件2.3 方法三&#xff1a;第三方软件 Reference 1.ubuntu主要用途 1、桌面操作系统&#xff1a;Ubuntu可用作个人电脑或笔记本电脑的操作系…

certbot—30秒部署HTTPS,永久免费,自动续约;ssl证书

Certbot 是一个由 Let’s Encrypt 开发的免费开源工具&#xff0c;用于自动化部署和管理 SSL/TLS 证书。它具有以下几个显著的好处&#xff1a; 免费证书&#xff1a;Certbot 使用 Let’s Encrypt 作为其证书颁发机构&#xff0c;Let’s Encrypt 提供免费的 SSL/TLS 证书。这意…

Doris 内网安装部署,基于 CentOS 7

实测 CentOS 7.6 和 7.9都可用&#xff0c;CentOS安装包为&#xff1a;标准安装盘DVD版&#xff0c;如果系统安装的是精简版&#xff0c;需要挂载DVD版或者自行下载依赖。 参考文档 快速开始 - Apache Doris Doris 下载地址&#xff1a;2.1.1 ( Latest ) -> x64 ( avx2 )…

Axios与Fetch——请求相关知识回顾

一、Axios 1、常规使用 &#xff08;1&#xff09;.then 方式 axios.get("./js/covid-data.json ").then(res > {this.list res.dataconsole.log(this.list);}); &#xff08;2&#xff09;async 方式 async mounted() {await axios.get("./js/covid-d…

计算两个时间段的差值

计算两个时间段的差值 运行效果&#xff1a; 代码实现&#xff1a; #include<stdio.h>typedef struct {int h; // 时int m; // 分int s; // 秒 }Time;void fun(Time T[2], Time& diff) {int sum_s[2] { 0 }; for (int i 0; i < 1; i) { // 统一为秒数sum_s[…

上海计算机学会 2023年9月月赛 乙组T2 方格路径(二)(最短路)

第二题&#xff1a;T2方格路径&#xff08;二&#xff09; 标签&#xff1a;最短路题意&#xff1a;给定 n m n m nm的方格地图&#xff0c;每个点要么是空地 . . .&#xff0c;要么是障碍物 ∗ * ∗&#xff0c;求左上角到右下角&#xff0c;最少的移除障碍个数&#xff0c…

ZCC8703 60V升压型、降压型、升降压型LED恒流驱动器 替代SY8703

描述&#xff1a; ZCC8703是一种集成功率开关的多工作模式、宽输入/输出DC-DC LED驱动芯片&#xff0c;具有3V到60V的宽输入电压范围&#xff0c;集成了软启动&#xff0c;从而最大限度地减少对外部浪涌抑制组件的需求&#xff0c;使其成为宽输入电源范围LED驱动的理想选择。输…

string的使用

string的使用 string的声明与初始化 读入字符串可用getline(cin, s) cin >> s int main(){//声明并初始化一个空字符串string str1;//使用字符串字面量初始化字符串string str2 "Hello Word!";//使用另一个string对象来初始化字符串string str3 str2;//使…

git 删除本地分支 删除远程仓库中的分支

语法&#xff1a; 删除本地分支 git branch -D <分支名>删除远程分支 git push <remote名称> <分支名> --delete 示例&#xff1a; 删除本地分支 git branch -D feature/test_listview删除远程分支 git push origin feature/test_listview --delete 两个…

【考研数学】《660》+《880》高分搭配方法

&#x1f4dd;《660题》和《880题》高效刷题方法 1️⃣做题要有针对性&#xff0c;不要为了做题而做题 &#x1f4aa;660和880题虽然多&#xff0c;但是你不用全都做完&#xff0c;你可以把它当成是题源&#xff0c;里面的每一道题都很经典&#xff0c;如果搞懂一道&#xff…

Qlik Sense : Crosstable在数据加载脚本中使用交叉表

什么是Crosstable&#xff1f; 交叉表是常见的表格类型&#xff0c;特点是在两个标题数据正交列表之间显示值矩阵。如果要将数据关联到其他数据表格&#xff0c;交叉表通常不是最佳数据格式。 本主题介绍了如何逆透视交叉表&#xff0c;即&#xff0c;在数据加载脚本中使用 L…