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