将 lambda 传递给对象并从 lambda 内部修改该对象

Passing lambda to an object and modify that object from inside the lambda

我的代码如下所示:

struct LambdaContainer{ 
    std::function<void(void)> f;
    float x = 10;
}

struct MyClass{
    LambdaContainer c;

}
void someFunction(){
    MyClass ins;
    LambdaContainer cont;
    cont.f = [&cont](){
        // I want to modify 'x' of LambdaContainer that is inside MyClass

        cont.x = 10; // won't work because cont will be copy constructed
                     // and this cont might not exist anymore
    };
    ins.c = cont;
    aVectorSomewhere.push_back(ins);
}

有什么方法可以捕获 LambdaContainer 'cont',使其指向调用 lambda 的任何地方? (顺便说一句,我没有使用指针)

谢谢你这么棒的回答:)我想我现在可以让它工作了

不是捕获 cont,而是将其传递给存储的 lambda:

class LambdaContainer
{ 
private:
    std::function<void(LambdaContainer&)> f;

public:
    float x = 10;

    void call_f()
    {
        f(*this);
    }
};

void someFunction()
{
    MyClass ins;
    LambdaContainer cont;
    cont.f = [](LambdaContainer& self)
    {    
        self.x = 10;
    };

    ins.c = cont;
    aVectorSomewhere.push_back(ins);
}

当您想调用 lambda 时,只需从现有实例执行 LambdaContainer::call_f 或根据您的设计添加从 MyClass 调用 call_f 的方法。

只是不要复制或分配不必要的东西,就可以了(更不用说效率更高了):

struct LambdaContainer { 
    std::function<void(void)> f;
    float x = 10;
};   
struct MyClass {
    LambdaContainer c;
    MyClass(const MyClass&) = delete; // noncopyable
    MyClass& operator=(const MyClass&) = delete;
};
void someFunction(){
    MyClass ins;
    ins.c.f = [&ins](){
        ins.c.x = 10;
    };
    aVectorSomewhere.emplace_back(std::move(ins));
}

ins 更改为动态分配并将 MyClass* 指针存储在向量中(使用 std::unique_ptr)。这样,lambda 捕获的地址在对象的生命周期内不会改变,因为不涉及复制。

struct LambdaContainer {
    std::function<void(void)> f;
    float x = 10;
};

struct MyClass {
    LambdaContainer c;
};

std::vector<std::unique_ptr<MyClass>> aVectorSomewhere;

void someFunction() {
    std::unique_ptr<MyClass> ins(new MyClass);
    LambdaContainer &cont = ins->c;
    cont.f = [cont]() {
        cont.x = 10;
    };
    aVectorSomewhere.push_back(std::move(ins));
}

然后,稍后调用 lambda:

aVectorSomewhere[index]->c.f();