C++11:在 lambda 函数中尝试捕获 class 的成员时无法捕获“this”
C++11: Cannot capture `this` when trying to capture member of class in lambda function
我正在编写一个简单的测试,以了解如何使用 C++11 Lambda 来实现代码重用最大化。我有一个函数,fill_vector()
,在一种情况下,我希望它简单地用随机数填充一个向量,但在另一种情况下,我希望它也能为我提供这些数字的最大值。
这是我目前的情况:
#include <iostream>
#include <random>
#include <vector>
#include <algorithm>
#include <iterator>
template <class Function>
void fill_vector(std::vector<int> &v, Function side)
{
for(auto i=v.begin(); i!=v.end(); ++i)
{
*i = rand() % 100;
}
side.lambda(v);
}
class null_test
{
public:
constexpr static auto lambda = [] (std::vector<int> x) { };
};
class test
{
public:
test() : max(0) { }
int max;
static auto lambda = [=] (std::vector<int> x) { max =
std::max_element(x.begin(),x.end()); };
};
int main()
{
std::vector<int> v(20);
null_test n;
fill_vector(v,n);
std::copy(v.begin(),v.end(),std::ostream_iterator<int>(std::cout," "));
std::cout << std::endl;
std::vector<int> v2(20);
test t;
fill_vector(v2,t);
std::copy(v.begin(),v.end(),std::ostream_iterator<int>(std::cout," "));
std::cout << std::endl;
std::cout << t.max << std::endl;
return 0;
}
这导致错误:“this”没有被这个 lambda 函数捕获,指向我在 test
中定义的 lambda。我尝试了各种捕获语句,但似乎无法正常工作。我错过了什么?
此外,是否可以在 fill_vector
的循环中使用 lambda,比如说,提取每个填充的第 n 个元素?我的目标是能够将 fill_vector
之类的函数尽可能多地用于其他可能需要在更大项目中稍作改动的函数。
看着你的 class test
:
class test
{
public:
int max;
static auto lambda = [=] (std::vector<int> x) {
max = std::max_element(x.begin(),x.end());
};
};
这里有几个问题:
lambda 上的 operator()
是 const
,而您正在尝试修改成员。
- 您正在尝试将值分配给外部变量,但按值捕获它,因此即使您创建了 lambda
mutable
,也不会发生任何事情。
- 您正在尝试使用不采用 class 实例的静态函数分配 class 的成员。
- 正如 dyp 指出的那样,
std::max_element
returns 是一个迭代器,而不是实际的元素。
您要编写的 lambda 可能如下所示:
test t;
std::vector<int> v2(20);
fill_vector(v2, [&t](const std::vector<int>& x){
t.max = *std::max_element(x.begin(), x.end());
});
只需将您的 fill_vector()
函数更改为可调用函数,而不是具有可调用函数的函数。
我正在编写一个简单的测试,以了解如何使用 C++11 Lambda 来实现代码重用最大化。我有一个函数,fill_vector()
,在一种情况下,我希望它简单地用随机数填充一个向量,但在另一种情况下,我希望它也能为我提供这些数字的最大值。
这是我目前的情况:
#include <iostream>
#include <random>
#include <vector>
#include <algorithm>
#include <iterator>
template <class Function>
void fill_vector(std::vector<int> &v, Function side)
{
for(auto i=v.begin(); i!=v.end(); ++i)
{
*i = rand() % 100;
}
side.lambda(v);
}
class null_test
{
public:
constexpr static auto lambda = [] (std::vector<int> x) { };
};
class test
{
public:
test() : max(0) { }
int max;
static auto lambda = [=] (std::vector<int> x) { max =
std::max_element(x.begin(),x.end()); };
};
int main()
{
std::vector<int> v(20);
null_test n;
fill_vector(v,n);
std::copy(v.begin(),v.end(),std::ostream_iterator<int>(std::cout," "));
std::cout << std::endl;
std::vector<int> v2(20);
test t;
fill_vector(v2,t);
std::copy(v.begin(),v.end(),std::ostream_iterator<int>(std::cout," "));
std::cout << std::endl;
std::cout << t.max << std::endl;
return 0;
}
这导致错误:“this”没有被这个 lambda 函数捕获,指向我在 test
中定义的 lambda。我尝试了各种捕获语句,但似乎无法正常工作。我错过了什么?
此外,是否可以在 fill_vector
的循环中使用 lambda,比如说,提取每个填充的第 n 个元素?我的目标是能够将 fill_vector
之类的函数尽可能多地用于其他可能需要在更大项目中稍作改动的函数。
看着你的 class test
:
class test
{
public:
int max;
static auto lambda = [=] (std::vector<int> x) {
max = std::max_element(x.begin(),x.end());
};
};
这里有几个问题:
-
lambda 上的
operator()
是const
,而您正在尝试修改成员。- 您正在尝试将值分配给外部变量,但按值捕获它,因此即使您创建了 lambda
mutable
,也不会发生任何事情。 - 您正在尝试使用不采用 class 实例的静态函数分配 class 的成员。
- 正如 dyp 指出的那样,
std::max_element
returns 是一个迭代器,而不是实际的元素。
您要编写的 lambda 可能如下所示:
test t;
std::vector<int> v2(20);
fill_vector(v2, [&t](const std::vector<int>& x){
t.max = *std::max_element(x.begin(), x.end());
});
只需将您的 fill_vector()
函数更改为可调用函数,而不是具有可调用函数的函数。