【发布时间】:2014-09-14 07:34:32
【问题描述】:
我正在尝试编写一个函数,它接受不同数据类型的多个参数并返回数字的总和。它应该能够决定用于求和的数据类型。例如 如果我写 add(3,1,2,3) 它应该将 sum 作为 int 返回。但是,如果我写 add(3,1,2.5,3.25) 它应该将 sum 作为双精度返回。
我尝试使用模板,但编译时出错。这是函数
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,但我不知道还要通过什么来保持它的概括性。
【问题讨论】:
-
你为什么不用Varidaic Templates?
-
当传递的参数是整数时,这确实解决了问题,但是当传递双精度值时,它给出了错误的答案。
-
@DarshilBabel 不,它有效。 See it live
-
它也适用于双倍live example here
-
编译错误是因为调用
add时没有指定typename。如果你想让它工作,你应该打电话给add<int>(3,1,2,3)。当然,这几乎结束了您在运行时确定返回类型的初始目标。从逻辑上考虑,如果不使用多态性,就没有办法做到这一点(在运行时确定返回类型)。
标签: c++