c++ - 添加可变数量的数字

标签 c++

我正在尝试编写一个接受不同数据类型的多个参数并返回数字总和的函数。它应该能够决定用于求和的数据类型。例如 如果我写 add(3,1,2,3) 它应该返回 sum 作为一个 int。但是,如果我编写 add(3,1,2.5,3.25),它应该以 double 返回总和。

我尝试使用模板,但出现编译时错误。这是函数

template <typename T>
T add(int n, ...)
{
    T sum = 0;
    va_list vl;
    va_start(vl,n);
    for(int i=0;i<n;i++)
    {
        sum += va_arg(vl,T);
    }
    va_end(vl);
    return sum;
}
int main()
{
    std::cout<<add(3,1,2,3);
    return 0;
}

编译错误:没有匹配函数来调用“add(int, int, int, int)”。 我认为错误即将到来,因为我传入了 va_arg T,但我不知道还要传递什么来保持它的通用性。

最佳答案

你应该替换

std::cout<<add(3,1,2,3);

std::cout<<add<int>(3,1,2,3);  // explicitly, int, double, float whatever

使代码成功运行,因为编译器无法从隐式调用中推断出类型名。 Live code example here

您的函数返回类型 T 的值,但您没有指定类型 T 的任何参数,使得编译器无法推断类型。


其他解决方案是添加适用于 add(0) 的重载,并在类型为 T 的 add 中传递第一个参数。这样可以达到OP的隐式推导目标。现在编译器可以从第一个参数推断出返回类型。

#include <cstdarg>
#include <iostream>
#include <cassert>
using namespace std;

int add(int n)
{
    assert(0 == n);
    return 0;
}

template <typename T>
T add(int n, T first, ...)
{
    T sum = first;
    va_list vl;
    va_start(vl,first);
    for(int i=1;i<n;i++)
    {
        sum += va_arg(vl,T);
    }
    va_end(vl);
    return sum;
}
int main()
{
    std::cout<<add(3,1,2,3);
    std::cout<<add(3,1.5,2.,3.5);
    return 0;
}

live code here

关于c++ - 添加可变数量的数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25831085/

相关文章:

c++ - C++中观察者模式实现中的循环引用

c++ - vector vector 的智能指针或常规指针

c++ - 通过 std::ifstream 从字符串中获取每个值

C++ lambda 通过引用捕获上下文以及 `this` 指针

c++ - 如何同时运行两个线程? Qt C++

c++ - 模板别名不起作用

c++ - 运算符 std::string() 常量?

c++ - 使用 OpenGL 的程序输出的 3D 显示

c++ - 如何让子类在 C++ 中返回一个不太通用的 typedef?

c++ - 矩阵乘法中最大运算的模运算