保定市建设局质监站网站,深圳管控最新消息,继续接入备案 增加网站 区别,网站运营工作计划前言 大家好吖#xff0c;欢迎来到 YY 滴C系列 #xff0c;热烈欢迎#xff01; 本章主要内容面向接触过C的老铁 主要内容含#xff1a; 欢迎订阅 YY滴C专栏#xff01;更多干货持续更新#xff01;以下是传送门#xff01; YY的《C》专栏YY的《C11》专栏YY的《Linux》… 前言 大家好吖欢迎来到 YY 滴C系列 热烈欢迎 本章主要内容面向接触过C的老铁 主要内容含 欢迎订阅 YY滴C专栏更多干货持续更新以下是传送门 YY的《C》专栏YY的《C11》专栏YY的《Linux》专栏YY的《数据结构》专栏YY的《C语言基础》专栏YY的《初学者易错点》专栏YY的《小小知识点》专栏 目录 一.可变参数模板【1】基本可变参数的函数模板演示【2】使用求函数包的大小——【...语法】【3】使用递归函数方式展开参数包遍历/打印演示【4】使用注意点参数包遍历/打印是不支持类似数组一样的遍历打印方式【5】使用逗号表达式方式展开参数包遍历/打印演示(看懂即可)【6】使用一般遍历/打印展开参数包的最常用方式——【...语法】 一.可变参数模板
【1】基本可变参数的函数模板演示 下面的参数 args 前面有省略号所以它就是一个 可变模版参数 我们把 带省略号的参数称为“参数包” 它里面包含了0到NN0个模板参数用可变模版参数的一个主要特点我们无法直接获取参数包args中的每个参数的只能通过展开参数包遍历的方式来获取参数包中的每个参数【可在第3小点查看详解】虽然 参数包的底层是 —— 类似数组的形式存储 但是语法不支持使用args[i]这样方式获取可变参数【可在第4小点查看详解】 // Args是一个模板参数包args是一个函数形参参数包
// 声明一个参数包Args...args这个参数包中可以包含0到任意个模板参数。
template class ...Args
void ShowList(Args... args)
{}【2】使用求函数包的大小——【…语法】 代码sizeof...(args) void ShowList(Args... args)
{cout sizeof...(args) endl;
}【3】使用递归函数方式展开参数包遍历/打印演示 如下面代码所示要设计两个函数 结束条件的函数 递归函数 分析 我们可以发现设计的_ShowList函数的参数是(T val, Args… args) 我们可以这样理解 —— 它把参数包的 第一个 拿了出来当作参数T 剩下的参数包 再整成另一个新的参数包args… void _ShowList()
{// 结束条件的函数————传空cout endl;
}template class T, class ...Args
void _ShowList(T val, Args... args)
{cout val ;_ShowList(args...);
}//args代表0-N的参数包
template class ...Args
void CppPrint(Args... args)
{_ShowList(args...);
}int main()
{CppPrint();CppPrint(1);CppPrint(1, 2);CppPrint(1, 2, 2.2);CppPrint(1, 2, 2.2, string(xxxx));// ...return 0;
}【4】使用注意点参数包遍历/打印是不支持类似数组一样的遍历打印方式 参数包不支持如下面代码所示根据其底层是 类似数组的形式 下面代码是想利用数组的方式打印 template class ...Args
void ShowList(Args... args)
{cout sizeof...(args) endl;// 不支持这样打印for (size_t i 0; i sizeof...(args); i){cout args[i] endl;}
}【5】使用逗号表达式方式展开参数包遍历/打印演示(看懂即可) 我们知道逗号表达式会 按顺序执行逗号前面的表达式 函数中的逗号表达式(printarg(args), 0)也是按照这个执行顺序先执行PrintArg(args)再得到逗号表达式的结果0同时还用到了C11的另外一个特性——初始化列表 通过初始化列表来初始化一个变长数组 {(printarg(args), 0)…}将会展开成((printarg(arg1),0),(printarg(arg2),0), (printarg(arg3),0), etc… ) 最终会创建一个元素值都为0的数组int arr[sizeof…(Args)]。由于是逗号表达式在创建数组的过程中会先执行逗号表达式前面的部分printarg(args)打印出参数也就是说在构造int数组的过程中就将参数包展开了 这个数组的目的 纯粹是为了在数组构造的过程展开参数包 template class T
void PrintArg(T t)
{cout t ;
}
//展开函数
template class ...Args
void ShowList(Args... args)
{int arr[] { (PrintArg(args), 0)... };cout endl;
}
int main()
{ShowList(1);ShowList(1, A);ShowList(1, A, std::string(sort));return 0;
}【6】使用一般遍历/打印展开参数包的最常用方式——【…语法】 用如下面代码所示构建数组即可int a[] { PrintArg(args)...}; void CppPrint()//单独讨论参数为空的清空
{cout endl;
}template class T
int PrintArg(T t)
{cout t ;return 0;
}//args代表0-N的参数包
template class ...Args
void CppPrint(Args... args)
{int a[] { PrintArg(args)...};cout endl;
}int main()
{CppPrint();CppPrint(1);CppPrint(1, 2);CppPrint(1, 2, 2.2);CppPrint(1, 2, 2.2, string(xxxx));return 0;
}