C++如何实现接收任意数量同类型参数的函数,无需额外传参?
可变参数求和函数实现方案
完全支持你要求的无额外参数、无额外大括号的调用形式,且具备编译期类型安全,不会出现C风格可变参数的容错问题。
适用C++11及以上版本的递归实现
兼容性最佳,无需依赖高版本C++特性:
// 递归终止条件:参数包为空时返回0 int total_sum() { return 0; } // 递归展开参数包 template<typename... Rest> int total_sum(int first, Rest... rest) { return first + total_sum(rest...); }
该实现会自动限定所有传入参数必须可隐式转换为int,若传入不兼容类型会直接编译报错,完全避免C风格可变参数的运行时错误。
适用C++17及以上版本的折叠表达式实现
写法最简洁,编译后效率和手写累加代码完全一致:
#include <type_traits> template<typename... Args, typename = std::enable_if_t<std::conjunction_v<std::is_same<int, Args>...>>> int total_sum(Args... args) { // 二元左折叠:从0开始累加所有参数 return (0 + ... + args); }
该实现通过std::conjunction_v严格限定所有传入参数必须是int类型,类型安全性更高,折叠表达式会在编译期直接展开为等价的累加代码,无任何运行时开销。
两种实现都完全支持你期望的调用形式:
total_sum(1, 2, 5, 4, 2); // 返回14 total_sum(5, 6, 2); // 返回13
内容的提问来源于stack exchange,提问作者justANewb stands with Ukraine
相关产品推荐
相关产品推荐

