C ++ 11:在尝试捕获lambda函数中的类成员时,无法捕获`this`

时间:2015-01-22 22:27:01

标签: c++ c++11 lambda

我正在编写一个简单的测试,以了解如何使用C ++ 11 Lambdas来最大化代码重用。我有一个函数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;
}

导致错误:这个lambda函数没有捕获'this',指向test中定义的lambda。我已经尝试了各种捕获语句,似乎无法正常工作。我错过了什么?

另外,是否可以在fill_vector的循环中使用lambda,可以说,提取每个填充的第n个元素?我的目标是能够尽可能多地重用像fill_vector这样的函数,以便在更大的项目中可能需要稍微改变它的其他函数。

1 个答案:

答案 0 :(得分:3)

查看您的课程test

class test
{
public:
    int max;
    static auto lambda = [=] (std::vector<int> x) {
        max = std::max_element(x.begin(),x.end()); 
    };
};

这里有几个问题:

    lambda上的
  1. operator()const,您正在尝试修改成员。
  2. 您正在尝试将值分配给外部变量,但是按值进行捕获,因此即使您创建了lambda mutable,也不会发生任何事情。
  3. 您正在尝试使用不接受该类实例的静态函数来分配类的成员。
  4. 正如dyp所指出的那样,std::max_element返回一个迭代器,而不是实际的元素。
  5. 你想写的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()函数更改为可调用函数,而不是具有可调用函数的函数。