我想写一个简单的加法程序(只是为了好玩),它可以将所有参数相加,并返回适当类型的总和。 目前,我的代码如下:
#include <iostream>
using namespace std;
template <class T>
T sum(const T& in)
{
return in;
}
template <class T, class... P>
auto sum(const T& t, const P&... p) -> decltype(t + sum(p...))
{
return t + sum(p...);
}
int main()
{
cout << sum(5, 10.0, 22.2) << endl;
}
在GCC 4.5.1上,对于两个参数,例如sum(2, 5.5),似乎可以正常工作并返回7.5。然而,如果有更多的参数,则会出现sum()未定义的错误。但是,如果我像这样声明sum():
template <class T, class P...>
T sum(const T& t, const P&... p);
那么它适用于任意数量的参数,但是sum(2, 5.5)将返回整数7,这不是我所期望的。 当参数大于两个时,我假设decltype()必须进行某种递归才能推断出t + sum(p...)的类型。这是否合法的C++0x?还是decltype()仅适用于非可变声明?如果是这种情况,你会如何编写这样的函数?
->decltype(expr)
中使用这种“递归调用”。 - sellibitzesum
无法找到正在定义的sum
模板。 - Johannes Schaub - litbint
和double
,函数模板将无法找到。如果参数中有一个全局声明的类,则会找到全局的sum
。所以这种情况是相当"随机"的,当它找到 "sum" 时,它并不能通用。 - Johannes Schaub - litb