具有列表参数C++11/C++14样式的求和函数
Sum function with list parameter C++11/C++14 style
我在Youtube上观看视频,视频展示了新标准(C++11、C++14)的各种功能。
我知道在C中有一个机会来创建这样的可变函数:
#include <stdarg.h>
#include <stdio.h>
double average(int count, ...)
{
va_list ap;
int j;
double sum = 0;
va_start(ap, count); /* Requires the last fixed parameter (to get the address) */
for (j = 0; j < count; j++) {
sum += va_arg(ap, int); /* Increments ap to the next argument. */
}
va_end(ap);
return sum / count;
}
int main(int argc, char const *argv[])
{
printf("%fn", average(3, 1, 2, 3) );
return 0;
}
视频显示了以下示例:
struct Sum
{
template <typename T>
static T sum(T n)
{
return n;
}
template <typename T, typename... Args>
static auto sum(T n, Args ... rest) -> decltype(n + sum(rest...))
{
return n + sum(rest...);
}
};
我使用第二组类似的代码:
int main()
{
int suma = Sum::sum(1, 2, 3, 4, 5, 6);
cout << suma;
return 0;
}
我发现它完全可行,所以它真的很棒。但我确实收到了警告:
(活动)没有重载函数"Sum::Sum"的实例与参数列表匹配
我的问题是:哪种方法更好,我如何在第二秒内摆脱警告?
第一个方法用于C,第二个方法用于带有类型检查的C++。
要修复C++14中的代码,请删除尾部返回类型:演示
c++17允许偶数折叠表达式:
template <typename ... Ts>
static auto sum(Ts...args)
{
return (0 + ... + args);
}
演示