可变参数模板(参考《C++ Templates 英文版第二版》)

Chapter 4 可变参数模板

自从C++11,模板可以接受可变数量的参数

4.1 可变参数模板

可以定义模板,去接受无限数量的模板参数

这种行为的模板叫做可变参数模板

4.1.1 例子

#include <iostream>template<typename T>
void print(T arg)
{std::cout << arg << std::endl;
}template<typename T, typename... Types>
void print(T firstArg, Types... args)
{std::cout << firstArg << '\n';  // print first argumentprint(args...);                 // call print() for remaining arguments
}int main(int argc, char* argv[])
{print(1, 4, 7, "妙");
}

4.1.3 运算符sizeof

C++11 之后,sizeof操作符对于可变参数模板有新的用法sizeof...,他返回参数包里面包含多少个元素

template<typename T, typename... Types>
void print(T firstArg, Types... args)
{std::cout << sizeof... (Types) << std::endl;std::cout << sizeof... (args) << std::endl;
}

4.2 折叠表达式

C++11 提供了可变模板参数包, 使函数可以接受任意数量的参数. 但在 C++11中展开参数包稍显麻烦, 而 C++17 的折叠表达式使得展开参数包变得容易,其基本语法是使用 (...) 的语法形式进行展开.

支持的操作符

折叠表达式支持 32 个操作符: +, -, *, /, %, ^, &, |, =, <,>, <<, >>, +=, -=, *=, /=, %=, ^=, &=, |=, <<=,>>=,==, !=, <=, >=, &&, ||, ,, .*, ->*

  • 对于一元右折叠 (E op …) 具体展开为 E1 op (… op (EN-1 op EN)).
  • 对于一元左折叠 (… op E) 具体展开为 (( E1 op E2) op …) op En.
  • 对于二元右折叠 (E op … op I) 具体展开为 E1 op (… op (EN-1 op (EN op I))).
  • 对于二元左折叠 (I op … op E) 具体展开为 (((I op E1) op E2) op …) op E2.
// define binary tree structure and traverse helpers:
struct Node {int value;Node* left;Node* right;Node(int i=0) : value(i), left(nullptr), right(nullptr) {}//...
};
auto left = &Node::left;
auto right = &Node::right;// traverse tree, using fold expression:
template<typename T, typename... TP>
Node* traverse (T np, TP... paths) {return (np ->* ... ->* paths);      // np ->* paths1 ->* paths2 ...
}int main()
{// init binary tree structure:Node* root = new Node{0};root->left = new Node{1};root->left->right = new Node{2};//...// traverse binary tree:Node* node = traverse(root, left, right);//...
}

使用(np->* ... ->* paths)这个折叠表达式去遍历参数代表的路径

使用折叠表达式我们可以实现打印参数列表

template<typename ... Types>
void print(Types const&... args)
{(std::cout << ... << args) << '\n';
}int main()
{int a{ 12 };std::string b{ "博主是帅哥" };print(a, b);
}

但是我们这个函数有个小缺陷,就是无法打印空格,让我们来实现一下:

template<typename T>
class AddSpace
{private:T const& ref;                  // refer to argument passed in constructorpublic:AddSpace(T const& r): ref(r) {}friend std::ostream& operator<< (std::ostream& os, AddSpace<T> s) {return os << s.ref << ' ';   // output passed argument and a space}
};template<typename... Args>
void print (Args... args) {( std::cout << ... << AddSpace(args) ) << '\n';
}

运行:

int main()
{int a{ 12 };std::string b{ "博主是帅哥" };print(a, b);
}

可变参数模板(参考《C++ Templates 英文版第二版》)相关推荐

  1. 非类型模板参数(参考《C++ Templates 英文版第二版》)

    非类型模板参数(参考<C++ Templates 英文版第二版>) Chapter 3 3.1 非类型类模板参数 与前几章的简单例子不同,你也可以通过std::array实例化一个固定大小 ...

  2. 类模板(参考《C++ Templates 英文版第二版》)

    类模板(参考<C++ Templates 英文版第二版>) Chapter 1 类模板 与函数相似,类也可以被一个或者多个类型参数化 在这章,我们使用栈作为例子 2.1 类模板stack的 ...

  3. 函数模板(参考《C++ Templates 英文版第二版》)

    C++模板编程(参考<C++ Templates 英文版第二版>) Chapter 1 函数模板 1.1 一窥函数模板 template<class T> T max(T a, ...

  4. C++可变参数模板的展开方式

    文章目录 前言 可变参数模板的定义 参数包的展开 递归函数方式展开 逗号表达式展开 enable_if方式展开 折叠表达式展开(c++17) 总结 前言 可变参数模板(variadic templat ...

  5. C++ Variadic Templates(可变参数模板)

    本文参考侯捷老师的视频:https://www.youtube.com/watch?v=TJIb9TGfDIw&list=PL-X74YXt4LVYo_bk-jHMV5T3LHRYRbZoH ...

  6. 利用python进行数据分析第二版pdf百度云_参考《利用Python进行数据分析(第二版)》高清中文PDF+高清英文PDF+源代码...

    第2版针对Python 3.6进行全面修订和更新,涵盖新版的pandas.NumPy.IPython和Jupyter,并增加大量实际案例,可以帮助高效解决一系列数据分析问题. 第2版中的主要更新了Py ...

  7. 可变参数模板 Variadic Templates

    可变参数模板 Variadic Templates 可变参数模板 可变参数模板的例子 重载可变和非可变参数模板 sizeof... 操作符 折叠表达式 可变参数模板的应用 可变参数类模板和可变表达式 ...

  8. 《汇编语言程序设计教程》人民邮电出版社第二版习题及参考答案

    网上的答案是第一版的,重新整理了一下 <汇编语言程序设计教程>人民邮电出版社第二版 刘慧婷,王庆生 主编 习题及参考答案 更多汇编内容请访问:omegaxyz.com 第一章至第五章 核对 ...

  9. 《数据结构与算法》第二版-陈卫卫-陆军工程大学811数据结构教材 第1-2章 参考答案

    <数据结构与算法>(第二版)陈卫卫-高等教育出版社     陆军工程大学811数据结构教材    第1-2章 参考答案 习题1.1 1.1-1      (1)名称.数量.特征.性质的   ...

最新文章

  1. ng1和ng2的部分对比----angular2系列(四)
  2. 从.Net框架Bug的提交到修复代码成功合并到.NET CoreFX主线
  3. [03] Android系统亮度调节
  4. [SDOI2006]线性方程组 高斯消元
  5. mysql 导出bson格式_mongodb 导入导出GridFS【图片/文件/视频/音频等多媒体文件的导入导出】...
  6. 基于JAVA+SpringMVC+Mybatis+MYSQL的羽毛球场预约管理系统
  7. day01-pycharm快捷键
  8. python定义一个空列表lt_4. Python 基础之阶段测试(一)
  9. 网络安全实验室 综合关 解析
  10. 航天金税开票导入导出txt格式
  11. 【回归分析】[3]--回归方程的显著性检验
  12. 香山处理器仿真环境搭建
  13. FSA-Net环境配置
  14. C基础(三)函数的使用
  15. 通过键盘移动鼠标光标 autohotkey
  16. 入手评测 ROG 冰刃 5 Plus怎么样
  17. 车牌对应城市行政区编号
  18. torch当中的MseLoss的reduction参数
  19. ZZULIOJ 1180-1198结构体专题 参考代码
  20. HTTP各版本号的区别

热门文章

  1. kkt条件的matlab仿真,请教关于SVM中KKT条件的推导
  2. vc mysql init 崩溃_故障分析 | 崩溃恢复巨慢原因分析
  3. vue中pdf预览组件_Vue+ElementUI使用vue-pdf实现预览功能
  4. MSP432P401R TI Drivers 库函数学习笔记(四)GPIO
  5. 2019年最流行的10个前端框架
  6. VMware10出现VMware Workstation 不可恢复错误: (vmx)
  7. windows下恢复删除的逻辑分区
  8. vue项目登录及token验证 vue-ant
  9. VMware “Transport(VMDB)error -44:Message”
  10. React开发(225):render中返回的值可以定义为一个方法