1. 可变参数模板( variadic template)

一个接受可变数目参数的模板函数或模板类。

1.1 参数包 (parameter packet)

可变数目的参数被称为参数包,存在两种参数包:

  • 模板参数包( template parameter packet), 表示零个或多个模板参数;
  • 函数参数包( function parameter packet ), 表示零个或多个函数参数。

1.1.1 一个省略号来指出一个模板参数或函数参数表示一个包

  • 在一个模板参数列表中, class…或 typename…指出接下来的参数表示零个或多个类型的列表: 一个类型名后面跟一个省略号表示零个或多个给定类型的非类型参数的列表。

  • 在函数参数列表中,如果一个参数的类型是一个模板参数包, 则此参数也是一个函数参数包。

1.1.2 举例

  • foo 是一个可变参数函数模板:一个名为 T 的类型参数,一个名为 Args的模板参数包。
  • foo 的函数参数列表:一个const &类型的参数(指向T的类型), 一个名为 rest 的函数参数包,
// Args 是一个模板参数包; rest 是一个函数参数包
// Args 表示零个或多个模板类型参数
// rest 表示零个或多个函数参数
template <typename T, typename... Args> void foo (const T &t, const Args & ... rest);int i = 0; double d = 3.14; string s = "how now brown cow";
foo (i, s, 42, d);//包中有三个参数
foo (s, 42, "hi" ); //包中有两个参数
foo (d, s);//包中有一个参数
foo ("hi" );//空包

编译器会为 foo 实例化出四个不同的版本:

void foo (const int &, const strings, const int &, const doubles);
void foo (const strings, const int &, const char [ 3 ] & )
void foo (const doubles, const strings);
void foo (const char [3] &);

1.2 sizeof…运算符

当我们需要知道包中有多少元素时, 可以使用 sizeof…运算符。sizeof…也返回一个常量表达式, 而且不会对其实参求值:

template<typename ... Args> void g (Args ... args) {cout « sizeof... (Args) « endl; // 类型参数的数目cout « sizeof... (args ) « endl; // 函数参数的数目
}

C++ Primer 5th笔记(chap 16 模板和泛型编程)可变参数模板相关推荐

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

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

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

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

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

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

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

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

  5. C++ Primer 5th笔记(chap 16 模板和泛型编程)包扩展

    1. 扩展 ( expand) 扩展一个包就是将它分解为构成的元素, 对每个元素应用模式, 获得扩展后的列表. 通过在模式右边放一个省略号(-)来触发扩展操作.当扩展一个包时,我们还要提供用于每个扩展 ...

  6. C++ Primer 5th笔记(chap 16 模板和泛型编程)重载与模板

    1. 定义 函数模板可以被另一个模板或一个普通非模板函数重载: 名字相同的函数必须具有不同数量或类型的参数 1.1 函数模板匹配因素 对于一个调用, 其候选函数包括所有模板实参推断成功的函数模板实例. ...

  7. C++ Primer 5th笔记(chap 16 模板和泛型编程)转发

    1. 转发 某些函数需要将其一个或多个实参连同类型不变地转发给其他函数. 因此需要保持被转发实参的所有性质, 包括实参类型是否是 const 的以及实参是左值还是右值. //接受一个可调用对象和另外两 ...

  8. C++ Primer 5th笔记(chap 16 模板和泛型编程)模板实参推断

    1. 模板实参推断( template argument deduction) 在模板实参推断过程中, 编译器使用函数调用中的实参类型来寻找模板实参, 用这些模板实参生成的函数版本与给定的函数调用最为 ...

  9. C++ Primer 5th笔记(chap 16 模板和泛型编程)成员模板

    1. 成员模板( member template) 一个类( 无论是普通类还是类模板) 可以包含本身是模板的成员函数. 成员模板不能是虚函数. 1.1 普通( 非模板 ) 类的成员模板 / / 函数对 ...

最新文章

  1. 【Datawhale-Python】Task1
  2. 使用PowerDesigner 15对现有数据库进行反向工程(图解教程) by Yulh
  3. Sizeof与Strlen的区别与联系
  4. 微信端 a 链接无法跳转
  5. 机器学习导论(张志华):EM算法
  6. Python配置-virtualenv和conda的区别
  7. 【C语言简单说】十五:while循环
  8. 收藏 | 李飞飞等发布200多页综述,阐述大模型机遇与风险
  9. 内外网切换软件_不需要软件,用命令简单实现内外网切换指定网段走哪条线路...
  10. excel文件导出相应数据统计内容
  11. Spark逻辑图的执行
  12. Spring的注解@Autowired和@Resource的区别
  13. windows系统ping端口及利用telnet命令Ping 端口
  14. 01.网络工程师常识
  15. matlab 广义最小二乘,广义最小二乘辨识的matlab实现
  16. java joda 获取utc时间_Java获取时间与系统时间相差8小时终极解决方案
  17. 四、Python数据挖掘(Pandas库)
  18. java哪个软件编程好学吗_java编程好学吗
  19. 笔记:C#_委托_delegate
  20. 再回首往事如梦,再回首。。。。。。

热门文章

  1. 多线程:Callable
  2. 计算机网络技术实训应用层,计算机网络技术
  3. 数据中心、智慧机房全套解决方案
  4. 微软成功测试氢燃料电池,为数据中心连续供电 48 小时
  5. 万物互联时代的边缘计算
  6. 用php写shell,php与shell实现多线程的简单例子
  7. 成功解决NameError: name ‘norm‘ is not defined
  8. DL之模型调参:深度学习算法模型优化参数之对LSTM算法进行超参数调优
  9. WeChat之小工具:基于C++程序代码设计的查看微信撤销、撤回消息(包括文本、图片、视频等)GUI小工具
  10. TF之LSTM:利用基于顺序的LSTM回归算法对DIY数据集sin曲线(蓝虚)预测cos(红实)(matplotlib动态演示)