2015-11-06 11 views
6

メンバ関数を呼び出すラムダを生成する必要がある場合は、参照でキャプチャするか 'this'をキャプチャする必要がありますか?私の理解では、 '&'は使用される変数だけをキャプチャしますが、 'this'はすべてのメンバ変数をキャプチャします。 「&」を使用する方が良いでしょうか?C++ラムダはこれをキャプチャと参照でキャプチャします

class MyClass { 
    public: 
    int mFunc() { 
     // accesses member variables 
    } 

    std::function<int()> get() { 
     //return [this]() { return this->mFunc(); }; 
     // or 
     //return [&]() { return this->mFunc(); }; 
    } 

    private: 
    // member variables 
} 

答えて

5

あなたが提供した特定の例については、thisでキャプチャしてください。概念的にはthisをキャプチャすることは意味がありません。thisの値を変更することはできないため、クラスのメンバーにアクセスするためのポインタとして使用することも、クラスインスタンスのアドレスを取得することもできます。ラムダ関数の中で暗黙的にthisポインタを使用するものにアクセスすると(たとえば、メンバー関数を呼び出したり、明示的にthisを使用せずにメンバー変数にアクセスした場合)、コンパイラはこれをそのままthisを使用したものとして扱います。複数のキャプチャもリストすることができます。したがって、メンバとローカル変数の両方をキャプチャする場合は、参照または値でキャプチャするかどうかを個別に選択できます。次の記事はあなたのラムダで良い接地を与えると捉える必要があります。

https://crascit.com/2015/03/01/lambdas-for-lunch/

また、あなたの例では、ラムダが呼び出し側に通過する戻り値の型としてstd::function使用しています。 std::functionはいつも考えているほど安くはないので、ラムダをstd::functionにラップするのではなく直接使うことができれば、より効率的になる可能性が高いことに注意してください。次の記事は、あなたの元の質問に直接関係していないが、lambdaとstd::functionに関する有用な資料を提供しています(関数オブジェクトを保存する別の方法がありますが、 :

https://crascit.com/2015/06/03/on-leaving-scope-part-2/

+0

ありがとうございました。 –

1

thisのキャプチャとキャプチャは、2つの直交する概念です。いずれかを使用することも、両方を使用することも、使用しないこともできます参考としてthisをキャプチャするのは意味がありませんが、値でthisをキャプチャしている間は、参照によって他の変数をキャプチャできます。

1

Hereは、&thisのキャプチャリストで使用されていることを示す良い説明です。

あなたがしなければならないことは、実行中のメソッドのthisによって実際に参照されるインスタンスのメンバ関数を呼び出すことだと仮定すると、キャプチャリストにthisを入れておけば十分です。

関連する問題