1.基本概念

  省略号在C/C++中有很多用途,包括函数的变量参数列表。C运行库的printf()就是常见示例。

可变参数模板提供了类型安全和灵活性,可应用于类模板和函数模板。

2.语法示例

template<typename ... args>

可变参数模板可以有0个或多个参数,如果要求至少一个参数:

template<typename one,typename... rest> class classname;

可变参数模板函数示例:

template<typename... Args> returnType fun(Args... args);             //参数按值传递
templata<typename... Args> returnType fun(Args&... args);            //参数引用传递
templata<typename... Args> returnType fun(Args*... args);            //参数为指针类型
templata<typename... Args> returnType fun(const Args&... args);      //常量引用
templata<typename one,typename... Args> returnType fun(const one& arg1,const Args&... args); //需要至少一个参数

程序示例:

template<typename... Arguments>
void tfunc(const Arguments&... args)
{  const unsigned numargs = sizeof...(Arguments);  X xobj[numargs]; // array of some previously defined type X
  helper_func(xobj, args...);
}  

3. C中的省略号

  在C中使用省略号显得比较麻烦,示例如下:

#include <stdio.h>
#include <stdarg.h>void test(int a,...); int main(){test(1, 2, 3, 4);return 0;
}
void test(int a,...)
{va_list args;int nArg = a; //a作为固定参数,用来确定变参的起始地址
    va_start(args, a);printf("%d\n", va_arg(args,int));printf("%d\n", va_arg(args, int));printf("%d\n", va_arg(args, int));va_end(args);}

  其中test函数是个简单的示例,在C中使用省略号必须要有一个指定参数(第一位参数),不能只有省略号。由于函数的参数入栈是从右往左入的,栈的生长是从高地址向低地址生长,所以在参数最左(第一位参数)指定参数就方便确定可变参数的地址了 ,不然没法取得可变参数。

  接下来va_list是指向参数的指针,在vadefs.h中定义如下:

typedef char *  va_list;

  然后看一下va_start的定义:

#define _crt_va_start(ap,v)  ( ap = (va_list)_ADDRESSOF(v) + _INTSIZEOF(v) )

  从该定义中可以看出来args指向了第二个参数2

  然后下一句是执行了va_arg(args,int),然后打印

  看一下它的定义

#define _crt_va_arg(ap,t)    ( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) )

  这句话是将args指向了下一个参数,但是输出的是下一个参数的上一个:( -_INTSIZEOF(t)),这样可以从第二个参数开始,因为va_start已经将args指向了第二个参数,如果不( -_INTSIZEOF(t))的话会跳过第二个,因为args是持续累加的,所以下面的va_arg(args,int)会连续指向第三个参数、第四个......

  然后最后的va_end(args)是释放args的指向

#define _crt_va_end(ap)      ( ap = (va_list)0 )

  但是使用va_arg的话会一直指向下一个,由于不知道参数的个数,早晚会内存溢出,这个问题还不太懂,留坑。。。

转载于:https://www.cnblogs.com/whlook/p/6478536.html

省略号和可变参数模板相关推荐

  1. C++11新特性之 可变参数模板

    C++ 11的可变模版参数是其新增的最强大的特性之一.通过对参数进行了泛化,可以表示从0到任意个数.任意类型的参数.我们知道对于一个模板类来说,通常只能含固定数量的模版参数,可变模版参数无疑是一个巨大 ...

  2. 代码模板在哪里_C++的可变参数模板

    背景 一切都从函数传参开始说起.我们知道,在C语言中有个神奇的函数:printf: printf("%s : %dn","gemfield number",70 ...

  3. [C++11新特性](24)列表初始化,右值引用,可变参数模板,lambda表达式,包装器

    文章目录 列表初始化 {}初始化 initializer_list auto.nullptr.范围for decltype STL的变化 右值引用 简介 移动构造与移动赋值 完美转发 新的类功能 可变 ...

  4. C++ Primer 5th笔记(chap 16 模板和泛型编程)可变参数模板

    1. 可变参数模板( variadic template) 一个接受可变数目参数的模板函数或模板类. 1.1 参数包 (parameter packet) 可变数目的参数被称为参数包,存在两种参数包: ...

  5. 【 C++11 】可变参数模板

    目录 1.可变参数模板的概念 2.参数包的展开方式 递归函数方式展开参数包 逗号表达式展开参数包 3.STL容器中的empalce相关接口函数 1.可变参数模板的概念 C++11的新特性可变参数模板能 ...

  6. 求变量的数据类型,typeid,bool,C和C++的不同,new和delete,C++中的枚举,inline和可变参数模板,auto和函数模板,宽字符

    求变量的数据类型,通过函数typeid(变量名).name();获得变量的数据类型. 案例如下: #include<iostream> #include<stdlib.h> v ...

  7. C++ 可变参数模板

    可变参数模板 C++11 增强了模板功能,在C++11之前,类模板和函数模板只能含有固定数量的模板参数,现在C++11中的新特性可变参数模板允许模板定义中包含0到任意个模板参数,可变参数模板和普通模板 ...

  8. 函数模板,函数模板重载,可变参数模板,函数模板覆盖,通过引用交换数据

     1.函数模板初级,如果想使用模板,需要实例化,实例化的方式是加上<数据类型> #include <iostream> //函数模板可以对类型进行优化重载,根据类型会覆盖 ...

  9. Variadic Templates(一)- 可变参数模板

    本文实现函数的可变参数模板(Variadic Templates) #include<iostream> using namespace std;void print() {}templa ...

最新文章

  1. 深度学习中的线代基础
  2. webstrom Certificate validation failed
  3. appium---【Mac】appium-doctor提示WARN:“fbsimctl cannot be found”解决方案
  4. 基于DataTabel的增删改查
  5. debian/ubuntu19.10下安装使用护眼软件f.lux
  6. SAP Commerce Cloud 里的 Solr 架构简介
  7. [转载] JVM(一):JVM体系结构详解
  8. java中程序名称可以用拼音嘛_用Java将文件名从中文转为拼音
  9. 为什么写了value属性 jq赋值value值不显示_为什么 String 要设计成 final,又如何设计一个不可变类呢?...
  10. 流程控制语句反汇编(1)(Debug版)
  11. ae怎么卸载已经安装的插件_ae红巨人插件卸载教程!
  12. 半桥LLC谐振变换器及同步整流MATLAB仿真(一)
  13. 2022-2027年中国双摄像头手机行业发展监测及投资战略研究报告
  14. 使用 ffmpeg批量给图片加水印
  15. CNN网络架构学习:Chapter-5-ResNet(附代码tensorflow)
  16. hdu1827 1269 2767 强连通分支 刷水
  17. 网易我的世界服务器如何安组件,网易我的世界组件包怎么使用
  18. 司马迁的智慧—东方最早的经济学综合论文《货殖列传》
  19. OC与C语言的一些区别
  20. javascript国际化_如何在JavaScript中实现国际化(i18n)

热门文章

  1. php in循环与for循环,详谈js中标准for循环与foreach(for in)的区别
  2. 【深度学习】Dropout与学习率衰减
  3. Keras【Deep Learning With Python】更优模型探索Keras实现LSTM
  4. php如何编写应用程序,编写安全 PHP 应用程序的七个习惯
  5. javascript搜索框联想搜索_js实现输入框联想搜索
  6. docker部署python web应用_在 Docker 中运行一个 Python 的 Web 应用
  7. python生成表格文件_python 读取excel文件生成sql文件实例详解
  8. 有条件截取字符串_Python小课堂之木辛老师特别讲解:再次深入浅出字符串的格式化...
  9. 什么是网络推广带你了解新上线的网站该如何提升关键词排名?
  10. 企业网络推广——企业网络有推广专员如何做好基本的网站优化布局