我正在尝试编写一个接受不同数据类型的多个参数并返回数字总和的函数。它应该能够决定用于求和的数据类型。例如 如果我写 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;
}
关于c++ - 添加可变数量的数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25831085/