将 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();
我的代码如下所示:
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();