首页 > 解决方案 > 使用可变参数模板的平方和

问题描述

我正在尝试使用可变参数模板找到平方和。输入参数是需要计算平方和的数字。例如:foo(2, 3, 4)应该返回一个值27(即2+(9+16))。我的模板函数如下所示:

template<typename T>
T foo(T args)
{
    return args*args;
}

template <typename T, typename... A>
T foo(T first, A... args)
{
    return first+foo(pow(args,2)...);
}

然而,这个函数的结果似乎是 261,这不是我所期望的。

标签: c++c++11templatesvariadic-templates

解决方案


简答:2 + 9 + 256 = 267

让我们扩展一下:

foo(2, 3, 4) => 2 + foo(pow(args, 2)...)
             => 2 + foo(pow(3, 2), pow(4, 2))
             => 2 + foo(9, 16)
             => 2 + (9 + foo(16))
             => 2 + (9 + 16 * 16)
             => 267
Hello world!

如果你想把它做对,不要pow()多次使用一个值:

template <typename T>
T foo(T arg)
{
    return arg * arg;
}

template <typename T, typename... A>
T foo(T first, A... args)
{
    return first * first + foo(args...);
    //     ^^^^^^^^^^^^^ or pow(first, 2)
}

推荐阅读