メンバー関数を呼び出すラムダを生成する必要がある場合、参照でキャプチャするか、「this」をキャプチャする必要がありますか?私の理解では、「&」は使用される変数のみをキャプチャしますが、「this」はすべてのメンバー変数をキャプチャします。 「&」を使用する方が良いですか?
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
}
提供した特定の例では、this
によるキャプチャーが必要です。概念的に、this
の値を変更することはできないため、参照によってthis
を参照でキャプチャすることはあまり意味がありません。クラスまたはクラスインスタンスのアドレスを取得します。ラムダ関数内で、this
ポインターを暗黙的に使用するものにアクセスする場合(たとえば、明示的にthis
を使用せずにメンバー関数を呼び出す、またはメンバー変数にアクセスする)、コンパイラーは、とにかくthis
を使用していました。複数のキャプチャをリストすることもできるため、メンバーとローカル変数の両方をキャプチャする場合は、参照または値のどちらでキャプチャするかを個別に選択できます。次の記事では、ラムダとキャプチャの基礎について説明します。
https://crascit.com/2015/03/01/lambdas-for-lunch/
また、この例では、std::function
を戻り値の型として使用して、ラムダを呼び出し元に返します。 std::function
は必ずしも思ったほど安価ではないことに注意してください。したがって、ラムダをstd::function
でラップするのではなく直接使用できる場合は、より効率的です。次の記事は、元の質問に直接関連していませんが、ラムダとstd::function
に関連する有用な資料を提供します(セクションを参照してください) 、しかし一般的な記事は興味深いかもしれません):
ここ は&
、this
およびその他は、キャプチャリストで使用される場合を示します。
あなたの場合、あなたがしなければならないことは、現在実行中のメソッドのthis
によって実際に参照されるインスタンスのメンバー関数を呼び出すことであると仮定して、this
をキャプチャに入れますリストで十分です。
this
のキャプチャと参照によるキャプチャは、2つの直交する概念です。 1つ、両方、またはなしを使用できます。参照によってthis
をキャプチャすることは意味がありませんが、値によってthis
をキャプチャしながら、参照によって他の変数をキャプチャできます。