c++17可变参函数模板详解
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可变参函数模板详解相关推荐
- 26.C++- 泛型编程之类模板(详解)
在上章25.C++- 泛型编程之函数模板(详解) 学习了后,本章继续来学习类模板 类模板介绍 和函数模板一样,将泛型思想应用于类. 编译器对类模板处理方式和函数模板相同,都是进行2次编译 类模板通 ...
- html 自定义打印模板,HTML+CSS入门 自定义模板详解
本篇教程介绍了HTML+CSS入门 自定义模板详解,希望阅读本篇文章以后大家有所收获,帮助大家HTML+CSS入门.< 首先总的stylecss和大模板都是当初angel_Kitty学姐的,嗯, ...
- 25.C++- 泛型编程之函数模板(详解)
本章学习: 1)初探函数模板 2)深入理解函数模板 3)多参函数模板 4)重载函数模板 当我们想写个Swap()交换函数时,通常这样写: void Swap(int& a, int& ...
- OpenCV-Python实战(17)——人脸识别详解
OpenCV-Python实战(17)--人脸识别详解 0. 前言 1. 人脸识别简介 2. 使用 OpenCV 进行人脸识别 2.1 使用 OpenCV 进行人脸识别流程示例 3. 使用 dlib ...
- 命运2服务器维护2021,命运2 2021年3月17日更新内容详解 冰影系列削弱一览[多图]...
命运2官方将在2021年3月17日的更新中对冰影系列进行削弱,部分玩家可能还不清楚,下面一起来看看命运2 2021年3月17日更新内容详解吧. 命运2 2021年3月17日更新内容详解 在3月17日即 ...
- 新闻类APP模板详解(android版)
1.概述 本文将介绍一个android版新闻类app模板,是本人整合了网上各类资源后整理出来的,希望对大家有所帮助! iOS版新闻类app模板详见: 新闻类APP模板详解(iOS版) 本模板app截图 ...
- android组件模板,提高效率必备神器 ---- Android Studio模板详解
原标题:提高效率必备神器 ---- Android Studio模板详解 Android Studio模板大家应该很熟悉,你新建一个project或者module的时候,AS会帮你提供几个选项供你选择 ...
- 【无标题】类模板详解\n类模板的定义及实例化\ntemplate\u003Cclass 模板参数>\nclass 类名 {\n // 类定义\n};\n\ntemplate\u003Ctypen
类模板详解\n类模板的定义及实例化\ntemplate\u003Cclass 模板参数>\nclass 类名 {\n // 类定义\n};\n\ntemplate\u003Ctypenam ...
- 【带你吃透C++】模板详解
本文收录于专栏:C++ 关注作者,持续阅读作者的文章,学习更多知识! https://blog.csdn.net/weixin_53306029?spm=1001.2014.3001.5343 模板详 ...
最新文章
- [20170914]tnsnames.ora的管理.txt
- 马斯克,特斯拉首席小白鼠
- 静态NAT技术三部曲
- iOS 控制屏幕横竖屏旋转
- 贷款审批到底会考核哪些内容?
- linux ssh应用
- css 里层元素撑不开外层元素
- Python3.2官方文档翻译--标准库概览(一)
- 新功能,赶紧用起来,CSDN浏览器助手-脚本功能,兼容油猴脚本安装使用
- 怎么用python扫描主机_python 扫描内网存活主机
- itools苹果录屏大师_iTools Pro 1.8.0.4 简单易用的苹果设备 iPhone/iPad 管理工具
- C语言中的运算符大全(内附优先级表)
- Js实现继承的6种方式
- es---elasticsearch-篇二:idea操作es,常用查询DSL
- 我梦想中的学习组织-勤学会
- 大部分人都容易焦虑,那么应该如何对待焦虑呢?
- Twitter新任80后印度裔CEO,为啥是他?
- Excel-给条形统计图加走线趋势
- 小米usb测试软件,你还在用USB传文件?小米10系列USB详细测试——《小米10十大槽点》番外 图文版...
- SecureRandom的江湖偏方与真实效果