【C++】可变参数模板使用总结(简洁易懂,详细,含代码演示)

【C++】可变参数模板使用总结(简洁易懂,详细,含代码演示)

一.可变参数模板【1】基本可变参数的函数模板演示:

下面的参数 args 前面有省略号,所以它就是一个 可变模版参数 我们把 带省略号的参数称为“参数包” ,它里面包含了0到N(N>=0)个模板参数用可变模版参数的一个主要特点:我们无法直接获取参数包args中的每个参数的,只能通过展开参数包(遍历)的方式来获取参数包中的每个参数【可在第3小点查看详解】虽然 参数包的底层是 ——> 类似数组的形式存储 ,但是语法不支持使用args[i]这样方式获取可变参数【可在第4小点查看详解】代码语言:javascript复制// Args是一个模板参数包,args是一个函数形参参数包

// 声明一个参数包Args...args,这个参数包中可以包含0到任意个模板参数。

template

void ShowList(Args... args)

{}【2】使用:求函数包的大小——>【…语法】

代码:sizeof...(args)代码语言:javascript复制void ShowList(Args... args)

{

cout << sizeof...(args) << endl;

}【3】使用:递归函数方式展开参数包(遍历/打印)演示:

如下面代码所示:要设计两个函数 结束条件的函数 递归函数 分析:

我们可以发现,设计的_ShowList函数的参数是(T val, Args… args) 我们可以这样理解 ,——> 它把参数包的 第一个 拿了出来当作参数T, 剩下的参数包 再整成另一个新的参数包args…

代码语言:javascript复制void _ShowList()

{

// 结束条件的函数————传空

cout << endl;

}

template

void _ShowList(T val, Args... args)

{

cout << val << " ";

_ShowList(args...);

}

//args代表0-N的参数包

template

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】使用注意点:参数包(遍历/打印)是不支持类似数组一样的遍历打印方式

参数包不支持如下面代码所示,根据其底层是 类似数组的形式 ,下面代码是想利用数组的方式打印代码语言:javascript复制template

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同时还用到了C++11的另外一个特性——初始化列表, 通过初始化列表来初始化一个变长数组 {(printarg(args), 0)…}将会展开成((printarg(arg1),0),(printarg(arg2),0), (printarg(arg3),0), etc… ) ,最终会创建一个元素值都为0的数组int arr[sizeof…(Args)]。由于是逗号表达式,在创建数组的过程中会先执行逗号表达式前面的部分printarg(args)打印出参数,也就是说在构造int数组的过程中就将参数包展开了, 这个数组的目的 纯粹是为了在数组构造的过程展开参数包 代码语言:javascript复制template

void PrintArg(T t)

{

cout << t << " ";

}

//展开函数

template

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)...};代码语言:javascript复制void CppPrint()//单独讨论参数为空的清空

{

cout << endl;

}

template

int PrintArg(T t)

{

cout << t << " ";

return 0;

}

//args代表0-N的参数包

template

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;

}

相关推荐

怎么把图片抠出来?分享6种简单易用的抠图方法
约彩365苹果在线安装

怎么把图片抠出来?分享6种简单易用的抠图方法

⌛ 2025-09-23 👁️ 8324
干货!网络“黑灰产”5大典型形态+3大治理建议
beat365体育亚洲版登录

干货!网络“黑灰产”5大典型形态+3大治理建议

⌛ 2025-08-31 👁️ 9126
高级玩物
约彩365苹果在线安装

高级玩物

⌛ 2025-07-11 👁️ 2993