当前位置: 首页 > 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.lryc.cn/news/582942.html

相关文章:

  • 零基础|宝塔面板|frp内网穿透|esp32cam远程访问|微信小程序
  • 链表算法之【移除链表元素】
  • 【深度学习新浪潮】什么是上下文长度?
  • C++异步编程入门
  • 猿人学js逆向比赛第一届第十五题
  • Java面试基础:概念
  • 部署并运行Vim/Vmamba在ImageNet上的训练与测试
  • JavaScript之数组方法详解
  • (C++)list列表相关基础用法(C++教程)(STL库基础教程)
  • HTTP/3.x协议详解:基于QUIC的下一代Web传输协议
  • 音频被动降噪技术
  • nng库使用
  • Android Handler机制与底层原理详解
  • Java 阻塞队列:7种类型全解析
  • 华为eNSP防火墙实验(包含详细步骤)
  • AR 双缝干涉实验亮相:创新科技实验范式,开拓 AR 技术新局​
  • Kafka多组消费:同一Topic,不同Group ID
  • 如何用Python编程计算权重?
  • 常见的网络攻击方式及防御措施
  • 分布式接口幂等性的演进和最佳实践,含springBoot 实现(Java版本)
  • 【c++学习记录】状态模式,实现一个登陆功能
  • 【ES实战】ES客户端线程量分析
  • 从 .proto 到 Python:使用 Protocol Buffers 的完整实践指南
  • 实战Linux进程状态观察:R、S、D、T、Z状态详解与实验模拟
  • 蓝桥杯 第十六届(2025)真题思路复盘解析
  • 50天50个小项目 (Vue3 + Tailwindcss V4) ✨ | StickyNavbar(粘性导航栏)
  • SPI / I2C / UART 哪个更适合初学者?
  • 【C++】AVL树底层思想 and 大厂面试
  • 27.移除元素(快慢指针)
  • AI大模型应用-Ollama本地千问大模型stream流乱码