erfassen member-variable durch den Wert
Wie würde ich fangen eine member-variable durch den Wert bei der Verwendung von C++11 lambda-Ausdrücke?
Mithilfe der [my_member]
syntax scheint nicht zu funktionieren, und der impliziten capture verwendet die this
Zeiger. Was wird brauchen, ist ein Weg, um explizit anzugeben, capture-Typ von member-Variablen. Ist das möglich?
Meine Abhilfe für jetzt ist:
void member_function()
{
std::shared_ptr<my_member_class> my_member_copy = my_member; //this shouldn't be necessary
std::async([=]{ std::cout << *my_member_copy; });
//std::async([=]{ std::cout << *my_member_; }); //wrong, my member could be potentially out of scope
}
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich glaube nicht, dass Sie erfassen kann ein Mitglied durch den Wert, den Sie erfassen können
this
aber da das Mitglied ist Teilthis
werden Sie mit einem shared-member und nicht eine neue variable.Nicht zu wissen, welche Art Ihr Mitglied ist so etwas wie dies funktionieren sollte:
Ich verstehe nicht, warum man mit einem
shared_ptr
in deinem Beispiel, wenn Sie aufnehmen möchten, indem Sie den Wert sicherlichshared_ptr
ist die Letzte Sache, die Sie berücksichtigen sollten.Leider, ich glaube nicht, dass es ein straight-forward Weg, dies zu tun, aber ich denke, der kann ein paar Möglichkeiten, zu erfassen, Mitglied, ohne dass eine zusätzliche Kopie.
Die erste option ist ähnlich wie dein Beispiel verwendet aber eine Referenz für die lokale variable:
Beachten Sie, dass es ein bug in der pre 4.6.2 Versionen von GCC, die verursachen, dass der Wert nicht kopiert werden. Sehen Erfassung von Referenz-Variablen kopieren in C++0x-lambda.
Ein zweiter Ansatz wäre die Verwendung von bind zu machen, die Kopie:
In diesem Beispiel, binden seine eigene Kopie
my_member
, und diese Kopie wird dann an den lambda-Ausdruck durch einen Verweis.my_member
. Meinem ersten Beispiel nur bindet, die Mitglied einer lokalen Referenz, so dass es eingefangen werden, indem der Wert in der lambda-capture, ohne zuerst kopiert. Mein zweites Beispiel war ein Weg, um zu vermeiden die Notwendigkeit für die Verwendung einer lokalen variable, die alle zusammen, mit binden zu erfassenmy_member
Wert-statt der lambda-capture.my_member_copy
und sollte damit auch schneller. Warum würden Sie downvote seine Antwort?shared_ptr
ist nicht so einfach, seine Kopie-Konstruktor hat den Nebeneffekt das Inkrementieren eines Zählers in eine thread-sichere Art und Weise implementiert wird, die auf die meisten (alle?) Plattformen mit atomics. Ich würde nicht Wetten, die optimiert werden können entfernt.my_member
ist nicht eine vorübergehende, wenn Baumy_member_copy
2)my_member_copy
ist nicht eine vorübergehende bei der Konstruktion der lambda.Da Ihre Frage über C++11 ist das nicht wirklich eine Antwort, aber in C++14, die Sie tun können, wie diese:
Es tut die gleiche Sache wie Sie Ihre eigene "work-around" (wenn my_member ist ein shared_ptr).
auto& (oben) funktioniert auch und beugt kopieren zweimal. Obwohl dieser Ansatz ist mehr syntax als vorbei [diese], es entfällt die übergabe in die Schließung einer Abhängigkeit, die auf das Objekt [das] Punkte zu.
Rechts nun, ich Stand vor dem gleichen problem und löste es selbst:
this
Zeiger.this->member
syntax innerhalb der lambda:Ist,
Es funktioniert für mich. Ich hoffe, es sollte auch für Sie arbeiten. Allerdings bin ich nicht ganz zufrieden mit dieser Erkenntnis. Nach meiner Arbeit werde ich für den Grund, warum diese syntax erforderlich ist, oder es ist ein compiler-bug. Ich bin mit
GCC 4.5.0
(MinGW).Gut, fand ich das folgende Thema, das sagt
this
Zeiger sollten erfasst werden, um die member der Klasse.