我想编写一个如下所示的通用求和函数,但不是使用模板语法,而是使用 lambda 语法:
template<typename T>
auto Sum(T lastSummand)
{
return lastSummand;
}
template<typename T, typename... Ts>
auto Sum(T firstSummand, Ts... restSummands)
{
return firstSummand + Sum(restSummands...);
}
因为通用 lambda 被映射到模板,所以应该可以执行以下操作:
auto sum = [](auto firstSummand, auto... restSummands) { ... };
但我无法弄清楚如何使用 lambda 进行递归。在此和其他位置进行搜索并没有取得太多进展。
最佳答案
在 C++14 中,您实际上不需要递归来使用泛型 lambda 执行此操作。
例如,您可以这样做:
#include<type_traits>
#include<iostream>
int main() {
auto l = [](auto... values) {
std::common_type_t<decltype(values)...> ret = {};
decltype(ret) _[] = { (ret += values)... };
(void)_;
return ret;
};
auto v = l(0, 0., 5, 4.2);
std::cout << v << std::endl;
}
返回类型由给定包的 std::common_type_t
给出。
代码的其余部分包含等待折叠表达式时通常使用的常见模式。
在 C++17 中它将变成:
#include<iostream>
int main() {
auto l = [](auto... values) { return (values + ...); };
auto v = l(0, 0., 5, 4.2);
std::cout << v << std::endl;
}
查看 wandbox .
如果您想即时验证给定参数是否都是算术类型,您可以使用 bool 技巧,如下所示:
auto l = [](auto... values) {
static_assert(
std::is_same<
std::integer_sequence<bool, true, std::is_arithmetic<decltype(values)>::value...>,
std::integer_sequence<bool, std::is_arithmetic<decltype(values)>::value..., true>
>::value, "!"
);
std::common_type_t<decltype(values)...> ret = {};
decltype(ret) _[] = { (ret += values)... };
(void)_;
return ret;
};
关于c++ - 如何在 C++ 中使用可变参数泛型 lambda 计算总和?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41409637/