C++可变参数模板

在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();
}
相关推荐
Sylvia-girl9 小时前
C++模板【上】
开发语言·c++
abc123456sdggfd9 小时前
C#怎么使用gRPC双向流_C#如何实现高效RPC调用【进阶】
jvm·数据库·python
2zcode9 小时前
基于MATLAB多特征融合与SVM的金属表面缺陷检测系统
开发语言·支持向量机·matlab
2zcode9 小时前
基于MATLAB脑电信号的帕金森病抑郁症检测研究
开发语言·matlab·抑郁症·帕金森病
untE EADO9 小时前
Java进阶之路,Java程序员职业发展规划
java·开发语言
xyq20249 小时前
C++ 变量作用域
开发语言
SKY -dada9 小时前
Understand 使用教程
开发语言·c#·流程图·软件构建·敏捷流程·代码复审·源代码管理
qq_414256579 小时前
Redis如何解决哨兵通知延迟问题_优化客户端连接池动态刷新拓扑的订阅监听机制
jvm·数据库·python
m0_676544389 小时前
MySQL如何配置不同级别的事务锁_调整innodb_locks_unsafe_for_binlog
jvm·数据库·python
dFObBIMmai9 小时前
mysql索引区分度不足如何解决_mysql多列索引组合优化
jvm·数据库·python