c++ - 如何在不知道 C++ 中有多少可选参数的情况下在循环中使用 va_arg?
问题描述
我想编写一个函数,它至少需要两个整数并返回传递给函数的所有整数的总和:
int sumOfAtLeastTwoIntegers(int a, int b, ...){
int sum = a+b;
va_list ptr;
va_start(ptr,b);
for(){
sum += va_arg(ptr, int)
}
va_end(ptr);
return sum;
}
我想知道 for 循环中的表达式必须如何看起来才能使循环继续,直到所有可选参数都添加到总和中。在不知道有多少可选参数传递给函数的情况下,我将如何实现这一点?函数调用如下所示:
sumOfAtLeastTwoIntegers(2,3,4,5,1,0,200);
解决方案
通常有两种处理可变参数的方法,前置知识和后置知识。
预知识就像 with 一样printf("%d %c\n", anInt, aChar)
,前面有一个参数,您可以使用它来计算剩余的数量。一个例子是:
int sumOfInts(size_t count, int a, ...); // Needs "count" integers.
int eleven = sumOfInts(2, 4, 7);
后知识要求你有一个哨兵值,告诉你什么时候停止,例如:
int sumOfNonZeroInts(int a, ...); // Needs non-zero integers, stops at 0.
int eleven = sumOfInts(4, 7, 0);
您可能要考虑的另一件事是避免使用变量参数列表,C++ 中有更多表达方式可以用来做您想做的事情,例如向量。以下提供了一种方法:
#include <iostream>
#include <vector>
template<typename T> T sumOf(const std::vector<T> &vec) {
T acc = T();
for (const T &item: vec)
acc += item;
return acc;
}
int main() {
auto eleven = sumOf<int>({4, 7});
std::cout << "Four plus seven is equal to " << eleven << '\n';
}
这不一定和变量参数一样快,但我现在的默认位置通常是首先优化可读性:-)
推荐阅读
- css - 我希望我的搜索框保持不透明度:当它处于活动状态时为 100%
- java - 嗨,我创建了一个 javafx 应用程序,其中应将特定图像裁剪为特定大小
- css - 为什么 CSS 样式即使在被覆盖后仍然存在?
- visual-studio - Git Bash:无法打开包含文件:'io.h':Windows 10 上没有这样的文件或目录
- xml - 如何在 VBA 中使用多行字符串变量写入 XML?
- ansible - Ansible 包含 vars 文件
- javascript - RxDb,使用默认索引时无法对字段 XXX 进行排序
- spring-boot - 春季数据休息端点未在aws上公开
- firefox - 同源请求会导致“访问控制允许源不匹配”错误,尽管源当然匹配。注意:具有带“沙盒”的 CSP 策略
- javascript - 尝试为我的 Word Dictionary 机器人修复 [object Object]