erfasst die Elementvariable nach Wert

8

Wie würde ich eine Elementvariable nach Wert abfangen, wenn ich C ++ 11 Lambda-Ausdrücke verwende?

Die Verwendung der [my_member] -Syntax scheint nicht zu funktionieren, und die implizite Erfassung verwendet den this -Zeiger. Was benötigt wird, ist eine Möglichkeit, den Erfassungstyp von Elementvariablen explizit anzugeben. Ist das möglich?

Mein Workaround für den Moment ist:

%Vor%     
ronag 15.09.2010, 13:22
quelle

5 Antworten

7

Ich glaube nicht, dass Sie ein Mitglied nach Wert erfassen können, Sie können this erfassen, aber da das Mitglied ein Teil von this ist, verwenden Sie ein freigegebenes Mitglied und keine neue Variable.

Es kann nicht funktionieren, wenn Sie nicht wissen, welcher Typ Ihr ​​Mitglied ist:

%Vor%

Ich verstehe nicht, warum Sie ein shared_ptr in Ihrem Beispiel verwenden, wenn Sie Wert nach Wert erfassen wollen shared_ptr ist das letzte, was Sie beachten sollten.

    
Motti 15.09.2010 13:39
quelle
4

Leider glaube ich nicht, dass es einen einfachen Weg dafür gibt, aber ich kann mir ein paar Wege vorstellen, ein Mitglied zu fangen, ohne eine zusätzliche Kopie zu erstellen.

Die erste Option ähnelt Ihrem Beispiel, verwendet jedoch eine Referenz für die lokale Variable:

%Vor%

Beachten Sie, dass ein Fehler in Versionen vor 4.6.2 von GCC vorliegt, die dazu führen, dass der Wert nicht kopiert wird. Siehe Capture Referenzvariable durch Kopie in C ++ 0x Lambda .

Ein zweiter Ansatz wäre die Verwendung von bind, um die Kopie zu erstellen:

%Vor%

In diesem Beispiel erstellt bind eine eigene Kopie von my_member , und diese Kopie wird dann als Referenz an den Lambda-Ausdruck übergeben.

    
rkjnsn 01.03.2012 00:27
quelle
2

Da es sich bei Ihrer Frage um C ++ 11 handelt, handelt es sich nicht wirklich um eine Antwort, aber in C ++ 14 können Sie Folgendes tun:

%Vor%

Es macht dasselbe wie Ihre eigene "Umgehung" (wenn my_member ein shared_ptr ist).

    
Jakob Schou Jensen 30.04.2015 08:10
quelle
1
%Vor%

auto & amp; (oben) funktioniert auch und vermeidet das Kopieren zweimal. Obwohl dieser Ansatz mehr Syntax als das Übergeben von [this] ist, vermeidet es, in die Schließung eine Abhängigkeit von dem Objekt zu übergeben, auf das [this] zeigt.

    
Christopher Augustus 16.05.2017 23:06
quelle
-1

Im Augenblick hatte ich das gleiche Problem und habe es selbst gelöst:

  1. Erfassen Sie den this -Zeiger.
  2. Schreiben Sie dann this->member syntax in das Lambda:

Das ist

%Vor%

Es funktioniert für mich. Ich hoffe, es sollte auch für dich funktionieren. Mit diesem Wissen bin ich jedoch nicht ganz zufrieden. Nach meiner Arbeit werde ich nach dem Grund suchen, warum diese Syntax benötigt wird, oder es ist ein Compiler-Fehler. Ich verwende GCC 4.5.0 (MinGW).

Nun, ich habe das folgende Thema gefunden, das besagt, dass this pointer erfasst werden sollte, um das Mitglied der Klasse zu verwenden.

Nawaz 30.10.2011 14:59
quelle

Tags und Links