Sum函数与列表参数C ++ 11 / C ++ 14样式

时间:2016-04-10 10:13:24

标签: c++ c c++11 c++14

我正在观看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("%f\n", 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;
}

我发现它完全可行,所以真的很棒。但我确实收到了警告:

  

(active)没有重载函数的实例“Sum :: sum”匹配参数列表

我的问题是:哪种方法更好,我怎样才能在第二种情况下摆脱警告?

1 个答案:

答案 0 :(得分:2)

第一种方法适用于C,第二种方法适用于带有类型检查的C ++。

要在C ++ 14中修复代码,请删除尾随返回类型: Demo

c ++ 17允许偶数折叠表达式:

template <typename ... Ts>
static auto sum(Ts...args)
{
    return (0 + ... + args);
}

Demo