如何为 lambda 提供一个与 lambda 一样长的内部值
How to give a lambda an internal value that lasts as long as the lambda?
我想要一个变量,我可以在 lambda 中修改而不影响封闭范围。行为如下:
std::vector vec = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
{
auto sum = 0;
std::for_each(vec.begin(), vec.end(), [sum](int value) mutable
{
sum += value;
std::cout << "Sum is up to: " << sum << '/n';
});
}
但是,我希望能够在不声明 lambda 外部的 sum
变量的情况下做到这一点。像这样:
std::vector vec = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
std::for_each(vec.begin(), vec.end(), [auto sum = 0](int value) mutable
{
sum += value;
std::cout << "Sum is up to: " << sum << '/n';
});
因此sum
仅在 lambda 内部可见,在封闭范围内不可见。在 C++11/14 中可能吗?
C++14 引入了广义 Lambda 捕获,允许您做您想做的事。
捕获将从 init 表达式的类型推断出来,就像通过 auto
一样。
[sum = 0] (int value) mutable {
// 'sum' has been deduced to 'int' and initialized to '0' here.
/* ... */
}
如果您
坚持使用 C++11(并且无法使用 C++14 的 lambda 捕获表达式,请参阅 @Snps' 的答案),那么您可以在 lambda 中声明一个静态变量,就像在任何其他函数中所做的那样。示例如下:
#include <algorithm>
#include <vector>
#include <iostream>
int main()
{
std::vector<int> vec = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
std::for_each(vec.begin(), vec.end(), [](int value)
{
static decltype(vec)::value_type sum{};
sum += value;
std::cout << "Sum is up to: " << sum << 'n';
});
}
至少在我看来
,有更好的方法可以做到这一点。您正在使用std::for_each
,但用它来模仿std::accumulate
。后者是手头工作的明确选择:
#include <numeric>
#include <iostream>
#include <vector>
int main(){
std::vector<int> vec = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
std::accumulate(vec.begin(), vec.end(), 0, [](int sum, int val) {
sum += val;
std::cout << "sum is up to: " << sum << "n";
return sum; });
}
我不确定这对你来说是否真的重要,但这不需要 C++11 以外的任何功能。
如果 C++14 不可用,您可以将所有内容包装在 lambda 中,这将返回原始 lambda,并立即调用它。
std::for_each(vec.begin(), vec.end(), []()
{
auto sum = 0;
return [sum](int value) mutable
{
sum += value;
std::cout << "Sum is up to: " << sum << 'n';
};
}());
这样,临时sum
的生存期就最短了。
相关文章:
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 可组合的lambda/std::函数与std::可选
- C++Boost Asio Pool线程,带有lambda函数和传递引用变量
- 如何建立使用模板函数的lambda函数的尾部返回类型
- 如何将lambda作为模板类的成员函数参数
- C++从其他 constexpr 创建 lambda 不能按顺序执行 Constexpr
- 在 lambda 捕获中声明的变量的类型推导
- 我可以将调用类的"this"传递给 lambda 函数吗?
- 为什么lambda在clang上崩溃而不是在gcc上崩溃
- 模板函数指针和lambda
- 两组使用lambda函数的大括号
- 使lambda不可复制/不可移动
- FLTK:按下哪个按钮 - 将数字传递给按钮的回调 (lambda)
- 尝试将lambda函数放在队列中时出现一般分配器错误(可能是与unique_ptr有关的错误)
- 将带有unique_ptr的可变 lambda 传递给 const&std::function
- AWS Lambda C++运行时权限被拒绝
- 捕获lambda中的std::数组
- 如何将不同的可执行文件合并到一个窗口框架中进行编码?像浏览器一样
- 它可能的 C++ 正则表达式评估器与 Lambda 像 Ruby 一样?
- 如何为 lambda 提供一个与 lambda 一样长的内部值