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

发布于:2025-07-09 ⋅ 阅读:(23) ⋅ 点赞:(0)


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

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;
}

输出
在这里插入图片描述


网站公告

今日签到

点亮在社区的每一天
去签到