首页 > 解决方案 > 如何在不知道 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);

标签: c++templatesvariadic-templatesvariadic-functions

解决方案


通常有两种处理可变参数的方法,前置知识和后置知识。

预知识就像 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';
}

这不一定和变量参数一样,但我现在的默认位置通常是首先优化可读性:-)


推荐阅读