如何在不知道C++中有多少可选参数的情况下在循环中使用va_arg?
How can I use va_arg in a loop without knowing how many optional arguments there are in C++?
我想编写一个函数,它至少接受两个整数并返回传递给该函数的所有整数的总和:
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);
通常有两种方法来处理变量参数,前知识与后知识。
预知就像printf("%d %cn", 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';
}
这不一定像变量参数那样快,但我现在的默认立场是通常首先优化可读性:-(
我建议使用如下所示的可变参数模板。仅当您至少给它两个整数时,它才有效。所有的参数也必须是整数。
#include<iostream>
#include <type_traits>
template< typename ... Args>
std::enable_if_t<std::is_same_v<std::common_type_t<Args...>, int>, int>
sum(int arg1, Args...args)
{
return (args+...+arg1);
}
int main(){
std::cout << sum(1,2);//working
std::cout << sum(1,.2);//compile error
std::cout << sum(1);//compile error
}
有三种方法可以处理变量参数函数:
两者都有某种终止符,一个参数,其唯一含义是终止参数列表。
使第一个参数成为传递的参数数的计数。
某种参数匹配格式,例如
printf
或scanf
.
对于您的函数类型,前两个变体都可以是很好的解决方案(取决于参数中允许的值范围(。
使用第一个参数作为"输入大小",就像使用常规数组一样,尤其是在 C 中。
int sumOfAtLeastTwoIntegers(int howMany, ...) {
int sum = 0
va_list ptr;
va_start(ptr,b);
while(howMany--){
sum += va_arg(ptr, int)
}
va_end(ptr);
return sum;
}
相关文章:
- 如何在不知道C++中有多少可选参数的情况下在循环中使用va_arg?
- 循环依赖,在继承类的情况下使用覆盖方法
- C++在不使用pow或循环的情况下计算一个数字的幂
- 如何在不循环的情况下使用getline读取文件
- 如何在没有同步的情况下使用多个线程(2、4,8、16 个线程)在循环(10,100、1000 个周期)中打印字符串?
- 如何在没有可变参数函数的情况下循环函数的参数
- 如果 return 语句在带括号的循环中,错误可能会到达非 void 函数的末尾,但不会显示在没有括号的循环的情况下
- 在给定相同的输入的情况下,某些代码怎么可能花费更多时间来运行,这似乎只是因为它处于循环中?
- 如何在不中断整个循环的情况下跳过循环交互 - C++
- 如何在不停滞主循环的情况下实现对话系统?
- 如何在不将其拆分为两个嵌套循环的情况下打印整个形状?
- 了解如何在不冻结事件循环的情况下在 QThread 中休眠/等待
- 视觉 在C++中,我试图在没有递归的情况下循环访问许多对象
- 默认情况下,C++ 开关运行时循环
- while 循环是否在设置标志的情况下运行多次?
- 有没有办法在不使用循环的情况下非具体地引用映射中的每个值?C++
- 我可以在不循环访问数组/向量的情况下检查数组/向量中的单词吗?
- 如何在不使用循环或迭代器的情况下检查所有列表元素并在满足条件时删除一个
- 您可以在没有列表或向量的情况下循环访问类对象吗?
- 在这种情况下,while 循环如何工作