返回可变参数包的添加

Amo*_*thm 6 c++ sum variadic-templates parameter-pack

假设我有一个sum带有可变参数包的函数。
该函数需要使用运算符 ADD UP 参数包中的所有参数+

注意:它不能以任何方式使用运算符+=,并且只能使用运算符+(因为程序不能假设所有参数都已operator+=重载)。

然后,函数sum需要返回整个“总和”或累加。

这是它的基本结构:

template <class... Args>
auto sum(Args... args)
{
    // ... The code
}
Run Code Online (Sandbox Code Playgroud)

注意:所有参数可能不是同一类型,并且您可以假设operator+参数包的所有类型都存在相应的重载。

了解我正在使用 C++ 20 可能会有所帮助。

alf*_*lfC 9

使用 C++17 的折叠表达式,https://en.cppreference.com/w/cpp/language/fold。大多数情况下您不需要指定返回类型。

#include<cassert>

template <class... Args>
auto sum(Args... args) {  // or right_fold_plus
    return (args + ...);
}

int main() {
    auto s = sum(1, 2, 3);
    assert( s == 1 + 2 + 3 );
}
Run Code Online (Sandbox Code Playgroud)

https://godbolt.org/z/1Yh118ETb

注意:语言需要一个函数来执行此操作,这几乎是一种意外,不幸的是,这为给函数提供“错误名称”提供了机会(从某种意义上说,它可以做名称所不做的事情)并不意味着,就像连接字符串一样)。从这个意义上说,sum不是一个好名字,因为它也可以称为concatenate。一个更中性的名称,没有语义含义,可以称之为right_fold_plus

...或者根本不给它命名[](auto... xs) {return (xs + ...);}(1, 2, 3)(参见https://godbolt.org/z/7x9PzrzY1