2016-09-03 26 views
2

内修改对象我有代码看起来像这样:
将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“续”以这样的方式,它的指的是从何处调用lambda? (我不使用指针,顺便说一句)

谢谢你,这么伟大的答案:)我想我可以得到它现在的工作

+5

这似乎是一个[XY问题(http://meta.stackexchange.com/questions/66377/what-is-the -XY-问题)。什么是*实际*问题?一旦你说明了实际问题,你可能会有一个简单的解决方案。 – Nawaz

+0

我正在做一个游戏,每个敌人都有独特的路线。我不想为每个对象创建我的敌人脚本的子类,因此我试图使其具有功能,并在我的初始化代码中对这些路由进行编码。所以我打算做的是传递一堆lambda。 – Rei

回答

3

而不是捕获cont的,它传递给存储拉姆达:

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); 
} 

当你要调用的拉姆达,只是从现有的情况下执行LambdaContainer::call_f或添加一个方法来调用从MyClasscall_f取决于你的设计。

3

只是不要复制或不必要的分配的事情,这将是OK(更不用说更有效):

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)); 
} 
2

变化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)); 
} 

然后,到后来叫拉姆达:

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