C++指定类型的模板可变参数sum函数编译错误求助
解决constexpr int类型可变参数sum函数的编译错误
你的代码核心问题是混淆了C风格可变参数(...)和C++模板可变参数,同时递归逻辑存在漏洞:
- 模板参数
int... args和函数的...没有关联,调用sum(1,2,3)时模板参数args为空,递归调用sum(args...)会变成无参调用,而你未定义无参版本的sum,直接触发C2660错误。 - C风格可变参数
...无法在constexpr上下文安全处理,也没法和模板参数配合实现类型安全的递归求和。
以下是两种可行的解决方案:
方案1:递归式可变参数模板(C++11及以上)
让函数参数直接使用模板可变参数,同时定义递归终止的基础情况:
#include <type_traits> #include <iostream> using namespace std; // 递归终止条件:单个int参数直接返回 constexpr int sum(int a) { return a; } // 递归逻辑:第一个参数 + 剩余参数的求和结果 template<typename... Ints> constexpr int sum(int first, Ints... rest) { // 强制所有参数必须是int类型 static_assert((std::is_same_v<Ints, int> && ...), "All arguments must be int"); return first + sum(rest...); } void test() { cout << sum(1, 2) << endl; // 输出3 cout << sum(1, 2, 3) << endl; // 输出6 cout << sum(1, 2, 3, 4) << endl; // 输出10 }
方案2:折叠表达式(C++17及以上,更简洁)
利用C++17的折叠表达式,无需手动写递归终止,一行实现求和:
#include <type_traits> #include <iostream> using namespace std; template<typename... Ints> constexpr int sum(Ints... args) { static_assert((std::is_same_v<Ints, int> && ...), "All arguments must be int"); // 左折叠自动展开所有参数的求和操作:((1+2)+3)+4 return (args + ...); } void test() { cout << sum(1, 2) << endl; // 输出3 cout << sum(1, 2, 3) << endl; // 输出6 cout << sum(1, 2, 3, 4) << endl; // 输出10 }
补充:支持空参数场景
如果需要允许无参调用sum()并返回0,可以额外定义无参版本:
constexpr int sum() { return 0; } // 对应递归版本可调整为: template<typename... Ints> constexpr int sum(int first, Ints... rest) { static_assert((std::is_same_v<Ints, int> && ...), "All arguments must be int"); return first + sum(rest...); } // 此时sum()返回0,sum(1)返回1,sum(1,2)返回3
内容的提问来源于stack exchange,提问作者Zhang
相关产品推荐
相关产品推荐

