当前位置: 首页 > news >正文

C++ 遍历可变参数的几种方法

C++ 遍历可变参数的几种方法

  • 一、第一种遍历方式
  • 二、 获取可变参数的长度
  • 三、递归遍历可变参数
  • 四、可变参数求和


先写一个最简单的可变参数函数

template<typename ...T>
void TestFunc(T&...Param)
{}

我们应该如何遍历传入的可变参数呢?
介绍如下几种遍历方式

一、第一种遍历方式

  • (PrintValue1(Param), 0) 是一个逗号表达式。逗号表达式会依次执行其前后的表达式,并返回最后一个表达式的值。这里先调用PrintValue1(Param)打印参数,然后返回整数0作为整个逗号表达式的结果。
  • 后面的…表示将逗号表达式按照参数包Param展开。假设有三个参数,则展开为:
    int arr[] = { (PrintValue1(Param1), 0), (PrintValue1(Param2), 0), (PrintValue1(Param3), 0) };
  • 这样,数组arr的元素就是三个0(即{0,0,0}),但在这个过程里,每个参数都被PrintValue1打印了一次。
template<typename T>
void PrintValue1(T& Value)
{std::cout << Value << std::endl;
}template<typename ...T>
void TestFunc(T&...Param)
{int arr[] = { (PrintValue1(Param), 0)... };
}

也可以换一种方式书写

template<typename T>
int PrintValue2(T& Value)
{return Value;
}template<typename ...T>
void TestFunc(T&...Param)
{int arr[] = { PrintValue2(Param)... };for (size_t i = 0; i < sizeof(arr) / sizeof(int); i++){std::cout << arr[i] << std::endl;}
}

二、 获取可变参数的长度

没什么好说的固定写法而已

template<typename ...T>
void TestFunc(T&...Param)
{int num = sizeof...(Param);std::cout << num << std::endl;
}

三、递归遍历可变参数

运用函数参数的特性,实现递归,注意递归到最后一个值时需要加上对应的函数去调用不然会报错

template<typename T>
void TestFunc(T& Value)
{std::cout << "Run1" << std::endl;std::cout << Value << std::endl;
}template<typename T,typename ...ParamValue>
void TestFunc(T& Head, ParamValue& ...Param)
{std::cout << "Run2" << std::endl;std::cout << Head << std::endl;TestFunc(Param...);
}

调用

int main()
{int value1 = 1;int value2 = 2;int value3 = 3;int value4 = 4;int value5 = 5;TestFunc(value1, value2, value3, value4, value5);system("pause");return 0;
}

输出
在这里插入图片描述

四、可变参数求和

算是上面递归遍历的一个使用案例

template<typename ParamTypes>
ParamTypes& TestFunc(ParamTypes& Param)
{std::cout << "Run 1" << std::endl;return Param;
}template<class T,typename ... ParamTypes>
T TestFunc(T& Head, ParamTypes &...Param)
{std::cout << "Run 2" << std::endl;return Head + TestFunc<T>(Param...);
}

调用

int main()
{int value1 = 1;int value2 = 2;int value3 = 3;int value4 = 4;int value5 = 5;int value = TestFunc(value1, value2, value3, value4, value5);std::cout << value << std::endl;system("pause");return 0;
}

输出
在这里插入图片描述

http://www.dtcms.com/a/270420.html

相关文章:

  • 数据库表设计:图片存储与自定义数据类型的实战指南
  • C语言宏替换比较练习
  • 暑假算法日记第四天
  • 5.6.2、ZeroMQ源码分析
  • 利用AI Agent实现精准的数据分析
  • ARM环境openEuler2203sp4上部署19c单机问题-持续更新
  • VM上创建虚拟机以及安装RHEL9操作系统并ssh远程连接
  • 大模型系列——RAG-Anything:开启多模态 RAG 的新纪元,让文档“活”起来!
  • Proface触摸屏编程软件(GP-Pro EX)介绍及下载
  • 金融行业信息
  • 力扣-75.颜色分类
  • Sentinel入门篇【流量治理】
  • 行业实践案例:医疗行业数据治理的挑战与突破
  • 【RAG知识库实践】数据源Data Source
  • ABP VNext + .NET Minimal API:极简微服务快速开发
  • B. Shrinking Array/缩小数组
  • Web后端实战:(部门管理)
  • 数据结构*搜索树
  • 二极管常见种类及基本原理
  • 【牛客刷题】小红的red字符串
  • MyBatis-Plus:提升数据库操作效率的利器
  • AB实验的长期影响
  • 【数据结构】复杂度分析
  • SpringBoot框架完整学习指南
  • [创业之路-489]:企业经营层 - 营销 - 如何将缺点转化为特点、再将特点转化为卖点
  • 钉钉企业应用开发技巧:在单聊会话中实现互动卡片功能
  • 学习日记-spring-day43-7.8
  • 基于物联网架构的温室环境温湿度传感器节点设计
  • 扣子Coze纯前端部署多Agents
  • WouoUI-Page移植