38 C++ 函数模版中含有可变参数的处理, 类模版中含有可变参数的处理

函数模版中含有可变参数

假设我们现在函数模版不确定有多少个参数,也不确定参数的类型,我们就可以在函数模版中使用可变参数

函数模版中有可变参数的写法

如何隔将函数模版中可变参数解析出来

//函数模版中含有可变参数
//假设我们现在函数模版不确定有多少个参数,0-N个,也不确定参数的类型,我们就可以在函数模版中使用可变参数//函数模版中有可变参数的写法,注意返回类型需要时确定的,如果返回类型是T 会报错template<typename ...T>
//T func113(T...args) {//build error ,返回类型如果是T 就会报错
int func113(T&...args) {cout << sizeof...(T) << endl;cout << sizeof...(args) << endl;return 0;
}//递归结束的条件,当没有参数的时候,就递归结束,
//实际测试中发现,如果func114()写在void func114(T&...args)后面,就不会调用到func114()这个函数。
void func114() {cout << "递归结束" << endl;}//如何将函数模版中可变参数解析出来呢?一般都是将借助递归方式来展开参数
template<typename ...T>
void func114(T&...args) {cout << sizeof...(T) << endl;cout << sizeof...(args) << endl;
}template<typename T , typename...U>
void func114(T& first, U&...otherargs) {cout << first << endl;func114(otherargs...);}void main() {int a = 90;double b = 89.9;func113(a, b);cout << "......" << endl;string s = "nihao";double d = 999.989;int c = 8765678;func114(s, d,c);
}

类模版中含有可变参数

解析方法一,使用继承自己的方式

//一般需要 private 继承自己,以方便展开包处理
template<typename ...T>
class Teacher115 {};//注意写法
template<typename First,typename ...Otherargs>
class Teacher115<First,Otherargs...> : private Teacher115<Otherargs...> {
public://在构造函数中,递归的调用自己Teacher115(First fir, Otherargs ...oth):Teacher115<Otherargs...>(oth...),m_i(fir) {cout << "m_i = " << m_i << endl;}First m_i;
};//然后最好写上父类0个参数的调用
template<> 
class Teacher115<> {
public:Teacher115() {cout<<"没有参数的构造函数"<<endl;}
};
void main() {Teacher115<string, int, double> teacher115("nihao", 89, 76878.89);cout << "断点在这里" << endl;
}

解析方法二 ,使用包含自己的方式

//组合方式 :一般需要包含自己,以方便展开包处理
template<typename ...T>
class Teacher116{};//注意写法
template<typename First,typename ...Otherargs>
class Teacher116<First,Otherargs...> {
public://在构造函数中,组合自己的变量赋值,注意方式Teacher116(First fir, Otherargs ...oth):m_i(fir) ,m_o(oth...){cout << "m_i = " << m_i << endl;}First m_i;Teacher116<Otherargs...> m_o;//要组合一个自己
};//然后最好写上父类0个参数的调用
template<> 
class Teacher116<> {
public:Teacher116() {cout<<"没有参数的构造函数"<<endl;}
};
void main() {Teacher116<string, int, double> teacher116(string("nigggghao"), 789, 787778.8);cout << "断点在这里" << endl;
}

解析方法三:通过tuple 和递归调用展开参数包

这种展开参数包的方式需要写类的特化版本,有一定的难度。

实现思路是:

有一个计数器,从0开始,每处理一个参数,计数器+1,一直到把所有的参数都处理完。最后搞一个模版偏特化,作为递归调用结束。

学习 tuple 的使用:

学习将函数模版中的参数,借助 tuple 和 类模版参数的意义解析

//学习tuple类的使用
//tuple类的功能是将不同的类型整合在一起
void main119() {tuple<float, int, string> mytu(12.5, 89, "nihao");//获取tuple类的数据cout << get<0>(mytu) << endl;cout << get<1>(mytu) << endl;cout << get<2>(mytu) << endl;}//泛化版本
template<int nowcount, int maxcount, typename...T>
class Teacher118 {
public:static void staticteacher118fun(const tuple<T...> &t) {cout << "value = " << get<nowcount>(t) << endl;Teacher118<nowcount + 1, maxcount, T...>::staticteacher118fun(t);}
};//特化版本,用于结束递归调用,注意这块的写法:class Teacher118<maxcount, maxcount,T...> 也就是说;当第一个参数和第二个参数一样的时候,就会走到这个特化版本
template<int maxcount, typename...T>
class Teacher118<maxcount, maxcount,T...> {
public:static void staticteacher118fun(const tuple<T...> &t) {cout << "循环结束了 " << endl;}
};template<typename...T>
void myfunc119(const tuple<T...> &t) {Teacher118<0, sizeof...(T), T...>::staticteacher118fun(t);
}
void main() {//先使用 tuple 将所有的参数都集合起来tuple<float, int, string> mytu(1222.5, 839, "n23ihao");myfunc119(mytu);//  value = 1222.5//	value = 839//	value = n23ihao//	循环结束了
}

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

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

相关文章

Python操作Word:轻松实现文档的创建、编辑与自动化处理

引言&#xff1a; 在日常工作和学习中&#xff0c;我们经常需要使用Microsoft Word来创建、编辑和处理文档。然而&#xff0c;手动操作Word可能会耗费大量的时间和精力。为了提高工作效率&#xff0c;我们可以使用Python编程语言来操作Word文档&#xff0c;实现文档的自动化处理…

ftp安装与配置 云服务器 CentOS7

1、FTP的安装 #安装 yum install -y vsftpd#设置开机启动 systemctl enable vsftpd.service#启动 systemctl start vsftpd.service#停止 systemctl stop vsftpd.service#查看状态 systemctl status vsftpd.service 2、配置FTP #修改前先进行备份文件 cp /etc/vsftpd/vsftpd…

腾讯云怎么领取免费云服务器?

腾讯云免费服务器申请入口 https://curl.qcloud.com/FJhqoVDP 免费服务器可选轻量应用服务器和云服务器CVM&#xff0c;轻量配置可选2核2G3M、2核8G7M和4核8G12M&#xff0c;CVM云服务器可选2核2G3M和2核4G3M配置&#xff0c;腾讯云服务器网txyfwq.com分享2024年最新腾讯云免费…

C#的索引和范围运算符的用法

目录 一、索引Index和末尾运算符 ^的索引 二、范围Range和范围运算符.. 1.规定 2.实例1 3.实例2&#xff1a;隐式范围运算符表达式转换 4.实例3&#xff1a;交错数组循环访问 5.实例4&#xff1a; 6.实例5 索引和范围为访问序列中的单个元素或范围提供了简洁的语法。依…

医院患者满意度调查的意义

医院患者满意度调查具有重要的意义&#xff0c;对医疗机构和患者都有益处。以下是医院患者满意度调查的一些主要意义&#xff1a; 改进医疗质量&#xff1a; 通过了解患者的反馈和意见&#xff0c;医院可以识别并解决服务质量方面的问题。这有助于提高医疗护理的质量&#xff…

弟12章 1 网络编程

文章目录 网络协议概述 p164TCP协议与UDP协议的区别 p165 网络协议概述 p164 ipv4&#xff1a;十进制点分制 ipv6&#xff1a;十六进制冒号分隔 TCP协议与UDP协议的区别 p165 tcp协议的三次握手&#xff1a;

行为型设计模式——备忘录模式

备忘录模式 备忘录模式提供了一种状态恢复的实现机制&#xff0c;使得用户可以方便地回到一个特定的历史步骤&#xff0c;当新的状态无效或者存在问题时&#xff0c;可以使用暂时存储起来的备忘录将状态复原&#xff0c;很多软件都提供了撤销&#xff08;Undo&#xff09;操作…

Acwing847 图中点的层次(bfs)

这道题用的是bfs&#xff0c;一开始用了dfs搜出了答案为4 题目 给定一个 n个点 m 条边的有向图&#xff0c;图中可能存在重边和自环。 所有边的长度都是 1&#xff0c;点的编号为 1∼n。 请你求出 1 号点到 n 号点的最短距离&#xff0c;如果从 1 号点无法走到 n 号点&…

【教程】微信小程序如何拍摄图片及视频并上传到后台进行存储

需求分析 在微信小程序中需要使用手机拍摄照片以及视频上传到后台进行进一步的操作&#xff0c;需要解决以下两个问题&#xff1a; 微信小程序如何拍摄照片及视频如何将拍摄的照片及视频上传到后台进行存储 解决方案 前端开发&#xff1a;微信小程序原生 后端开发&#xf…

sentinel熔断与限流

文章目录 一、sentinel简介Sentinel 是什么&#xff1f;Sentinel安装 二、sentinel整合工程新建cloudalibaba-sentinel-service8401微服务引入依赖yml配置主启动类添加EnableDiscoveryClient业务类测试 三、sentinel流控规则基本介绍流控模式直接&#xff08;默认&#xff09;关…

Web前端-移动web开发_流式布局

文章目录 移动web开发流式布局1.0 移动端基础1.1浏览器现状1.2 手机屏幕的现状1.3常见移动端屏幕尺寸1.4移动端调试方法 2.0 视口2.1 布局视口 layout viewport2.2视觉视口 visual viewport2.3理想视口 ideal viewport&#xff08;苹果&#xff09;2.4meta标签 3.0 物理像素(手…

0x32 约数

0x32 约数 定义 若整数 n n n除以整数 d d d的余数为0&#xff0c;即 d d d能整除 n n n&#xff0c;则称 d d d是 n n n的约数&#xff0c; n n n是 d d d的倍数&#xff0c;记为 d ∣ n d|n d∣n。 算术基本定理的推论 在算术基本定理中&#xff0c;若正整数 N N N被唯一…

c 小熊猫 c++ IDE编译ffmpeg 设置

菜单-》运行-》编译器选项-》链接时加入下列选项 &#xff1a; -I /usr/local/ffmpeg/include -L /usr/local/ffmpeg/lib -lavformat -lavdevice -lavfilter -lavcodec -lavutil -lswscale -lswresample -lm 本机ffmpeg存储位置&#xff1a;include &#xff1a;/usr/local/ff…

十三、QPalette的简单使用(Qt5 GUI系列)

目录 一、设计需求 二、实现代码 三、代码解析 四、总结 一、设计需求 在实际应用中&#xff0c;经常需要改变某个控件的颜色外观&#xff0c;如背景、文字颜色等。Qt提供的调色板类 QPalette 专门用于管理对话框的外观显示。QPalette 类相当于对话框或是控件的调色板&…

metartc5_jz源码阅读-yang_rtcpush_on_rtcp_ps_feedback

// (Payload-specific FB messages&#xff0c;有效载荷反馈信息)&#xff0c;这个函数处理Payload重传 int32_t yang_rtcpush_on_rtcp_ps_feedback(YangRtcContext *context,YangRtcPushStream *pub, YangRtcpCommon *rtcp) {if (context NULL || pub NULL)return ERROR_RTC…

记录:排查create_ap偶发无法开启自发AP的问题

背景说明&#xff1a; 系统&#xff1a;Xubuntu16.04&#xff1b;内核&#xff1a;4.14&#xff1b;无线网卡&#xff1a;EDIMAX EW-7822UAC 关于无线网卡的驱动安装和create_ap配置参考博文&#xff1a;Xubuntu16.04系统中使用EDIMAX EW-7822UAC无线网卡开启5G自发AP 目录 问题…

分布式系统的三字真经CAP

文章目录 前言C&#xff08;Consistency 数据一致性&#xff09;A&#xff08;Availability 服务可用性&#xff09;P&#xff08;Partition Tolerance 分区容错性&#xff09;CAP理论最后 前言 你好&#xff0c;我是醉墨居士&#xff0c;我一起探索一下分布式系统的三字真经C…

大数据调度框架Oozie,这个学习网站让你事半功倍!

Oozie是一个基于工作流引擎的开源框架&#xff0c;由Cloudera公司贡献给Apache。它主要用于管理和调度Apache Hadoop作业&#xff0c;支持的任务类型包括Hadoop MapReduce、Pig Jobs等。 Oozie的核心概念包括workflow jobs和coordinator jobs。Workflow jobs是由多个动作&#…

解决ssh: connect to host github.com port 22: Connection refused

ssh: connect to host github.com port 22: Connection refused 是连接github.com的端口号22拒绝连接。 可以使用github的443端口。 解决方案 在~/.ssh/config中添加如下字段&#xff1a; $ vim ~/.ssh/config # 如果没有config 文件就新建一个 Host github.comHostname ss…

Jmeter 性能-监控服务器

Jmeter监控Linux需要三个文件 JMeterPlugins-Extras.jar (包&#xff1a;JMeterPlugins-Extras-1.4.0.zip) JMeterPlugins-Standard.jar (包&#xff1a;JMeterPlugins-Standard-1.4.0.zip) ServerAgent-2.2.3.zip 1、Jemter 安装插件 在插件管理中心的搜索Servers Perform…