2016-09-03 11 views
2

内部からそのオブジェクトを変更します。私はこのようなコードを持っているオブジェクトにラムダを渡すとラムダ

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を撮影する今

+5

を[XY問題](http://meta.stackexchange.com/questions/66377/what-is-theのようです-xy-問題)。 *実際の問題は何ですか?実際の問題を述べると、実際の問題に対する簡単な解決策が得られるかもしれません。 – Nawaz

+0

私はそれぞれの敵に固有のルートがあるゲームを作っています。私はすべてのオブジェクトのために私の敵のスクリプトをサブクラス化したくないので、私はそれを機能させ、私の初期化コードでルートをコード化しようとしています。だから私がやりたいことはラムダの束を渡すことです。 – Rei

答えて

3

仕事を得ることができると思います。

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を実行したり、あなたのデザインに応じてMyClassからcall_fを呼び出す方法を追加します。

3

だけコピーしないか、不必要なものを割り当てて、それが(より効率的に言及していない)OKになります:insが動的に割り当てられる

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

の変更をし、(使用して、ベクターでMyClass*ポインタを格納std::unique_ptr)。このようにして、ラムダがキャプチャするアドレスは、オブジェクトの存続期間中は変更されません。なぜなら、コピーが含まれていないからです。

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(); 
関連する問題