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 可能会有所帮助。
使用 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)
| 归档时间: |
|
| 查看次数: |
114 次 |
| 最近记录: |