C++ - lambda-capture mit dieser vs capture by reference
Wenn ich brauche, um zu erzeugen ein lambda-Ausdruck, der fordert, eine member-Funktion, sollte ich erfassen, durch einen Verweis oder capture 'das'? Mein Verständnis ist, dass '&' erfasst nur die Variablen verwendet, aber 'dies' erfasst alle member-Variablen. Also besser, zu verwenden '&'?
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
}
Du musst angemeldet sein, um einen Kommentar abzugeben.
Des konkreten Beispiels haben Sie zur Verfügung gestellt, die Erfassung von
this
ist, was Sie wollen. Konzeptionell erfassenthis
Verweis nicht machen eine ganze Menge Sinn, da können Sie nicht ändern Sie den Wert vonthis
können Sie nur verwenden Sie es als Zeiger für den Zugriff auf Mitglieder der Klasse oder um die Adresse der Instanz der Klasse. Innerhalb Ihrer lambda-Funktion, wenn Sie den Zugriff auf Dinge, die implizit diethis
Zeiger (z.B. Aufruf einer member-Funktion oder den Zugriff auf eine member-variable, ohne sich explizit mitthis
), der compiler behandelt Sie, als ob Sie benutzt hattethis
sowieso. Sie können mehrere Aufnahmen zu, wenn Sie so wollen, zu erfassen, sowohl die Mitglieder als auch die lokalen Variablen, die Sie wählen können, unabhängig davon, ob Sie zu fangen per Referenz oder per Wert. Der folgende Artikel sollte Ihnen eine gute Erdung in lambdas und erfasst:https://crascit.com/2015/03/01/lambdas-for-lunch/
Auch, dein Beispiel nutzt
std::function
als Rückgabe-Typ, durch die der lambda-Ausdruck an den Aufrufer übergeben. Werden Sie sich bewusst, dassstd::function
ist nicht immer ganz so Billig, wie Sie vielleicht denken, so, wenn Sie in der Lage sind, die Verwendung einer lambda direkt, anstatt auf die wickeln Sie es in einstd::function
, es wird wahrscheinlich effizienter sein. Die folgenden Artikel zwar nicht direkt zu deiner ursprünglichen Frage, kann immer noch geben Ihnen einige nützliche material in Bezug auf lambdas undstd::function
(siehe Abschnitt Eine alternative Methode, um die Funktion Objekt, aber der Artikel wird im Allgemeinen von Interesse sein könnten):https://crascit.com/2015/06/03/on-leaving-scope-part-2/
Hier ist eine gute Erklärung, was
&
,this
und der andere zeigen, wenn in der capture-Liste.In Ihrem Fall, unter der Annahme, dass alles, was Sie tun müssen, ist Aufruf einer member-Funktion der Instanz, auf die eigentlich verwiesen wird, die von der
this
von der Methode, die gerade ausgeführt wird, setzenthis
in Ihre capture-Liste sollte genug sein.Erfassung
this
und die Erfassung von Referenz sind zwei orthogonale Konzepte. Sie können eine, beide oder keine. Es macht keinen Sinn zu erfassenthis
durch den Hinweis, aber Sie können die Aufnahme weiterer Variablen per Referenz während der Aufnahmethis
Wert.