c++17可变参函数模板详解

news2024/11/15 19:33:16

c语言中对于 可变参数的处理是用va_list等一系列宏去做的 他只会生成一个函数 但是理解起来非常麻烦 因为你不得不去了解很多关于汇编层面栈帧的知识

c++对于可变参数函数模板进行了改进 他会生成多个函数 而不是在一个函数里玩 个人觉得c++这种方式更加先进而且更好理解 接下来让我们看看c++对于可变参数是怎么处理的吧

1.参数类型固定 参数个数可变

可以直接使用c++11提供的initializer_list去实现 具体原理是开辟堆区空间生成对象来实现 实现方法如下

#include<initializer_list>
void test(std::initializer_list<int> list)
{
    for (auto i : list) {//do someting
    }
        for (auto it = list.begin(); it != list.end(); it++) { //do something
        }
}
int main()
{
    test({ 1,2,3,4 });
    test({ 5,6,7,9 });
}

2.参数类型可变 参数个数可变

参数类型可变 参数个数固定压根就没这种说法 如果有 那就使用和这种一样的方式

 c++使用函数模板来解决参数类型和个数均可变的情况 相比较于C的不同 他是在编译阶段会生成多个函数 加长了编译的时间 加大了可执行文件的大小 但是提高了程序的执行效率

void test()
{
    //当参数为0的时候 结束递归
}
template<typename T,typename... U>
void test(T&& first, U&&... others)
{
    //使用参数first去做一些事情后
    //继续递归剩下的参数
    std::cout << first;
    test(others...);
}

但是上面会有个明显的缺点 就说我们一定要去定义一个同名的test函数且参数为0的函数来结束递归 当用户传入0个参数的时候不就没有调用到我们真正的模板函数中来了嘛?

所以c++17加入了编译期if语句来支持这种写法 让你在编译期就可以对参数类型和个数做出判断 改进后的代码如下所示 

template<typename T,typename... U>
void test(T&& first, U&&... others)
{
    //使用参数first去做一些事情后
    //继续递归剩下的参数
    std::cout << first;
    if constexpr (sizeof...(others) > 0)
        test(others...);
}
int main()
{
    test(1,2,"string");
}

加入这种语句后 相当于指导了编译过程 不仅减少了编译后的函数个数 减小可执行文件的大小 而且代码可读性得到了极大的增强 代码运行后 结果如图所示:

 

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

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

相关文章

线性代数的本质

注&#xff1a;目前没有精力去美化排版&#xff0c;所有博客仅作为自己学习记录所用 《线性代数的本质》课程链接&#xff08;bilibili&#xff09; 目录&#xff1a; P1-P4的内容&#xff1a; 1.线性代数的加法&#xff1a;为什么这样子来定义呢&#xff08;如图&#xff…

(附源码)SSM人力资源管理系统 毕业设计 271621

SSM人力资源管理系统 摘 要 科技进步的飞速发展引起人们日常生活的巨大变化&#xff0c;电子信息技术的飞速发展使得电子信息技术的各个领域的应用水平得到普及和应用。信息时代的到来已成为不可阻挡的时尚潮流&#xff0c;人类发展的历史正进入一个新时代。在现实运用中&#…

Servlet(二):Servlet的运行原理HttpServlet、HttpServletRequest、HttpServletResponse类详解

Servlet运行原理Servlet API详解HttpServlet类HttpServletRequest类HttpServletResponse类Servlet API详解 Servlet API中包含了很多的内容&#xff0c;但我们主要用到的是以下三个类&#xff0c;HttpServlet&#xff0c;HttpServletRequest&#xff0c;HttpServletResponse …

2022-04-10-Docker

layout: post #标题配置 title: Docker #时间配置 date: 2022-04-10 22:50:00 0800 #目录配置 categories: Docker #标签配置 tag: 学习笔记 content {:toc} Docker 1.初识 Docker 1.1 docker概念 我们写的代码会接触到好几个环境&#xff1a;开发环境、测试环境以及生产环…

祖师爷香农,到底有多神?

1916年&#xff0c;第一次世界大战激战正酣。在这一年的4月30日&#xff0c;远离战场的美国密歇根州佩托斯基&#xff08;Petoskey&#xff09;&#xff0c;一个男婴呱呱坠地。这个男婴&#xff0c;就是我们这篇文章的主角——香农。香农的全名&#xff0c;叫做克劳德艾尔伍德香…

Alvas.Audio专门为C#和VB.Net程序员设计

Alvas.Audio专门为C#和VB.Net程序员设计 Alvas.Audio库使C#和VB.Net程序员能够创建执行(包括混合声音信息)、捕获、转换和编辑音频的应用程序。 Alvas.Audio音频是C#音乐库。Web程序员。 这使您能够生产。NET程序&#xff0c;例如Winforms/WPF/Windows服务/控制台录音机、Inter…

steam搬砖项目,新手也能月入8000+(详细教程)

大家好&#xff0c;我是阿阳 这个项目很早之前就有了&#xff0c;而且这么久以来一直非常稳定。 作为一名没有任何经验却想通过低成本投入来赚钱的小白&#xff0c;做steam搬砖项目真的可以实现财富自由 0成本&#xff0c;操作简单&#xff0c;有手机就能做&#xff01;真的…

【Golang】欲入此Go先看Go的基本语法

&#x1f4d3;推荐网站(不断完善中)&#xff1a;个人博客 &#x1f4cc;个人主页&#xff1a;个人主页 &#x1f449;相关专栏&#xff1a;CSDN专栏、个人专栏 &#x1f3dd;立志赚钱&#xff0c;干活想躺&#xff0c;瞎分享的摸鱼工程师一枚 &#x1f34a;前言 完成了我们众多…

OpenAI 最强对话模型 ChatGPT 注册使用笔记

2022年12月5日OpenAI 发布了对话语言模型 ChatGPT&#xff0c;并开放了免费试用。ChatGPT 是一款基于GPT3模型的聊天机器人&#xff0c;该聊天机器人可以在模仿人类说话风格的同时回答大量的问题。在现实世界之中&#xff0c;例如数字营销、线上内容创作、回答客户服务查询&…

Python使用Opencv图像处理方法完成手势识别(一)

Opencv完成手势识别HSV的提取特征提取轮廓绘制完整代码由于是使用Opencv完成手势识别&#xff0c;所以首先利用颜色特征是对手的颜色进行提取&#xff0c;获得HSV的最小值与最大值。HSV的提取 HSV颜色空间阈值主要是靠Trackbar调节阈值和cv2.inRange来生成掩膜来提取。 这是我…

外汇天眼:外汇市场上不得不说的两大类庄家!

前一阵子&#xff0c;天眼君跟好友讨论外汇市场上有没有庄家&#xff0c;今天天眼君就跟大家探讨下这个问题。我们都知道股票交易中是有所谓的庄家的&#xff0c;散户必须要猜测庄家的做法&#xff0c;否则很有可能变成待割的韭菜。 而我们常见的对外宣传中&#xff0c;基本上…

R语言对推特twitter数据进行文本情感分析

原文链接&#xff1a;http://tecdat.cn/?p4012我们以R语言抓取的推特数据为例&#xff0c;对数据进行文本挖掘&#xff0c;进一步进行情感分析&#xff0c;从而得到很多有趣的信息&#xff08;点击文末“阅读原文”获取完整代码数据&#xff09;。找到推特来源是苹果手机或者安…

C++ Reference: Standard C++ Library reference: Containers: list: list: assign

C官网参考链接&#xff1a;https://cplusplus.com/reference/list/list/assign/ 公有成员函数 <list> std::list::assign C98 范围 (1) template <class InputIterator> void assign (InputIterator first, InputIterator last); 填充 (2) void assign (…

字符串处理【AC自动机】 - 原理 AC自动机详解

字符串处理【AC自动机】 - 原理 AC自动机详解 AC自动机&#xff08;Aho-Corasick automaton&#xff09;在1975年产生于贝尔实验室&#xff0c;是著名的多模匹配算法。 学习AC自动机&#xff0c;要有KMP和Trie&#xff08;字典树&#xff09;的基础知识。 KMP是单模匹配算法&a…

三代全长16s助攻,轻松搞定水体研究领域10+文章

基于PacBio三代测序平台&#xff0c;可高效获得16s rRNA全长序列&#xff0c;同时不必纠结引物选择带来的结果偏差&#xff0c;令物种分类更多更精准——到达“种”水平。Pacbio平台同时兼具时间短&#xff0c;无需扩增等优势&#xff0c;伴随着三代测序成本的下降&#xff0c;…

<VSCode下载、安装、配置以及连接云服务器进行Linux开发>

目录 1.下载、安装VSCode 2.配置环境及插件 2.1 实用插件安装 2.1.1 中文汉化插件 2.1.2 Remote-ssh插件​ 连接远程云服务器&#xff1a; 远程云服务器开发&#xff1a; Xshell界面与VSCode界面对比&#xff1a; 2.1.3 C/C Extension Pack&#xff08;C/C扩展包&#xff0…

Java实现后端跨域的常见解决方式

目录一、搭建服务&#xff08;cross-server&#xff09;1.1、maven依赖1.2、接口1.3、配置二、搭建服务&#xff08;cross-web&#xff09;2.1、maven依赖2.2、接口2.3、页面2.4、配置2.5、跨域请求结果2.6、常见跨域情况三、解决方案3.1、通过 CrossOrigin 注解3.2、通过配置类…

Kafka高级特性解析之主题

1、管理 使用kafka-topics.sh脚本&#xff1a; 选项说明--config <String: namevalue>为创建的或修改的主题指定配置信息。支持下述配置条目&#xff1a; cleanup.policycompression.typedelete.retention.msfile.delete.delay.msflush.messagesflush.msfollower.repli…

不影响1,4丁炔二醇(BYD)的情况下去除铜离子的工艺

1,4-丁炔二醇BYD&#xff08;but-2-yne-1,4-diol&#xff09;是一种重要的中间体化工原料&#xff0c;广泛应用于生产丁二醇及其下游产品、维生素B6的主要原料&#xff0c;还可以用于镀镍的增亮剂、防腐抑制剂等领域。 1,4&#xff0d;丁二醇&#xff08;BDO&#xff09;是一种…

(附源码)ssm人才市场招聘信息系统 毕业设计 271621

基于jsp的人才市场招聘信息系统的设计与实现 摘 要 人才市场招聘信息系统采用B/S结构、java开发语言、以及Mysql数据库等技术。系统主要分为管理员、用户、两部分&#xff0c;管理员管理主要功能包括&#xff1a;首页&#xff0c;站点管理&#xff08;轮播图、公告栏&#xf…