使用可变参数模板的平方和

时间:2018-04-25 15:06:20

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

我试图使用可变参数模板找到平方和。输入参数是需要计算其平方和的数字。例如:foo(2, 3, 4)应返回值272+(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,这不是我的预期。

3 个答案:

答案 0 :(得分:2)

简答: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)
}

答案 1 :(得分:1)

  

我试图使用可变参数模板找到平方和。输入参数是需要计算其平方和的数字。例如:foo(2,3,4)应返回值27(即2+(9 + 16))

玩的已经太晚了?

无论如何,如果你想找到平方和,foo(2, 3, 4)应该返回4+9+16 = 29,而不是27

我提出了一个非递归函数,在初始化未使用的整数数组时使用逗号运算符的强大功能

template <typename T, typename ... Ts>
T foo (T const & t, Ts const & ... ts)
 {
   using unused = int[];

   T  ret { t*t };

   (void)unused { 0, (ret += ts*ts, 0)... };

   return ret;
 }

来自

std::cout << foo(2, 3, 4) << std::endl;

你得到29

如果您可以使用C ++ 17,则可以使用模板折叠,foo()只需

template <typename ... Ts>
auto foo (Ts const & ... ts)
 { return ( (ts*ts) + ... ); }

答案 2 :(得分:0)

为了达到你在描述中所期望的结果,你需要在一个函数中捕获“第一个”,然后单独递归:

template<typename T>
T bar(T first) {
    return first*first;
}    

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

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

如果您希望对函数中的每个参数求平方并求它们,则应执行以下操作:

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

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