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");
}

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

c++17可变参函数模板详解相关推荐

  1. 26.C++- 泛型编程之类模板(详解)

    在上章25.C++- 泛型编程之函数模板(详解) 学习了后,本章继续来学习类模板   类模板介绍 和函数模板一样,将泛型思想应用于类. 编译器对类模板处理方式和函数模板相同,都是进行2次编译 类模板通 ...

  2. html 自定义打印模板,HTML+CSS入门 自定义模板详解

    本篇教程介绍了HTML+CSS入门 自定义模板详解,希望阅读本篇文章以后大家有所收获,帮助大家HTML+CSS入门.< 首先总的stylecss和大模板都是当初angel_Kitty学姐的,嗯, ...

  3. 25.C++- 泛型编程之函数模板(详解)

    本章学习: 1)初探函数模板 2)深入理解函数模板 3)多参函数模板 4)重载函数模板 当我们想写个Swap()交换函数时,通常这样写: void Swap(int& a, int& ...

  4. OpenCV-Python实战(17)——人脸识别详解

    OpenCV-Python实战(17)--人脸识别详解 0. 前言 1. 人脸识别简介 2. 使用 OpenCV 进行人脸识别 2.1 使用 OpenCV 进行人脸识别流程示例 3. 使用 dlib ...

  5. 命运2服务器维护2021,命运2 2021年3月17日更新内容详解 冰影系列削弱一览[多图]...

    命运2官方将在2021年3月17日的更新中对冰影系列进行削弱,部分玩家可能还不清楚,下面一起来看看命运2 2021年3月17日更新内容详解吧. 命运2 2021年3月17日更新内容详解 在3月17日即 ...

  6. 新闻类APP模板详解(android版)

    1.概述 本文将介绍一个android版新闻类app模板,是本人整合了网上各类资源后整理出来的,希望对大家有所帮助! iOS版新闻类app模板详见: 新闻类APP模板详解(iOS版) 本模板app截图 ...

  7. android组件模板,提高效率必备神器 ---- Android Studio模板详解

    原标题:提高效率必备神器 ---- Android Studio模板详解 Android Studio模板大家应该很熟悉,你新建一个project或者module的时候,AS会帮你提供几个选项供你选择 ...

  8. 【无标题】类模板详解\n类模板的定义及实例化\ntemplate\u003Cclass 模板参数>\nclass 类名 {\n // 类定义\n};\n\ntemplate\u003Ctypen

    类模板详解\n类模板的定义及实例化\ntemplate\u003Cclass 模板参数>\nclass 类名 {\n    // 类定义\n};\n\ntemplate\u003Ctypenam ...

  9. 【带你吃透C++】模板详解

    本文收录于专栏:C++ 关注作者,持续阅读作者的文章,学习更多知识! https://blog.csdn.net/weixin_53306029?spm=1001.2014.3001.5343 模板详 ...

最新文章

  1. [20170914]tnsnames.ora的管理.txt
  2. 马斯克,特斯拉首席小白鼠
  3. 静态NAT技术三部曲
  4. iOS 控制屏幕横竖屏旋转
  5. 贷款审批到底会考核哪些内容?
  6. linux ssh应用
  7. css 里层元素撑不开外层元素
  8. Python3.2官方文档翻译--标准库概览(一)
  9. 新功能,赶紧用起来,CSDN浏览器助手-脚本功能,兼容油猴脚本安装使用
  10. 怎么用python扫描主机_python 扫描内网存活主机
  11. itools苹果录屏大师_iTools Pro 1.8.0.4 简单易用的苹果设备 iPhone/iPad 管理工具
  12. C语言中的运算符大全(内附优先级表)
  13. Js实现继承的6种方式
  14. es---elasticsearch-篇二:idea操作es,常用查询DSL
  15. 我梦想中的学习组织-勤学会
  16. 大部分人都容易焦虑,那么应该如何对待焦虑呢?
  17. Twitter新任80后印度裔CEO,为啥是他?
  18. Excel-给条形统计图加走线趋势
  19. 小米usb测试软件,你还在用USB传文件?小米10系列USB详细测试——《小米10十大槽点》番外 图文版...
  20. SecureRandom的江湖偏方与真实效果

热门文章

  1. 【机器学习】随机森林
  2. 10月24日,成为程序员的节日
  3. java jdk版本_java-jdk各版本特性概述
  4. 阿里仓库及Spring脚手架
  5. spring版本冲突报错解决:引入dubbo包,排除dubbo依赖的低版本spring
  6. 手游平台游戏源码为什么要选择PHP作为后端语言
  7. Mac使用技巧之快速显示桌面
  8. linux所有用户都无法登录,记一次Linux用户无法登陆问题
  9. [最小二乘法] 多边定位--求解未知点坐标
  10. 云锁许可更新使用指引