在python中,支持可变参数作为函数形参,这是一项很好的功能(代码段1),那么在C++中有没有这样的方式支持可变参数呢。这里提供两种实现方式以供参考。其中方式1支持多种类型可变参数输入,方式2更简洁,但是不支持多种参数类型输入。
python中可变参数:
python
def average(*x):
if len(x) == 0:
return 0
return sum(x) / len(x)
x1,x2,x3,x4=map(eval,input().split())
b=average(x1,x2)
print('两个数平均值为:{:.2f}'.format(b))
b=average(x1,x2,x3)
print('三个数平均值为:{:.2f}'.format(b))
b=average(x1,x2,x3,x4)
print('四个数平均值为:{:.2f}'.format(b))
C++中可变参数实现1:
使用递归+可变参数模板展开
这里之所以定义两个可变参数是为了每次递归展开可变参数包中第一个,剩余在后续递归展开。也就是为了防止程序无限递归
cpp
//C++11
template<typename T, typename... Args>
double average(T first, Args... args) {
return (first + (sizeof...(args) * average(args...))) / (sizeof...(args) + 1);
}
C++中可变参数实现2:
使用初始化列表,这种方式更为简洁,但是不适用于不同类型参数。
cpp
double average(std::initializer_list<double> numbers) {
if (numbers.size() == 0) return 0.0;
double sum = 0.0;
for (double num : numbers) {
sum += num;
}
return sum / numbers.size();
}