使用变异模板的正方形总和

Sum of squares using variadic templates

本文关键字:正方形 变异      更新时间:2023-10-16

我正在尝试使用variadic模板找到正方形的总和。输入参数是需要计算正方形之和的数字。例如: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,这不是我所期望的。

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

我正在尝试使用variadic模板找到正方形的总和。输入参数是需要计算正方形之和的数字。例如: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) + ... ); }

要达到您所期望的结果,您需要在一个函数中捕获"首先",然后以这样的单独重复:

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...);
}