Seite 1 von 1

Closures

Verfasst: Do Feb 25, 2010 9:53 am
von Xin
Da ich jetzt seit 25 Jahren Software entwickle, gab es zu meiner Anfangszeit noch keine Closures.

Closures wird häufig als tolles Feature beschrieben, aber irgendwo bleibt mir der tiefere Sinn des Closures verborgen. Ich vermute, dass das vorrangig daran liegt, dass ich eine Erwartung an Closures habe, die ich nicht finde, weil ein Closure nur ein anderer Name für etwas ist, was ich kenne. Somit finde ich also nichts Neues.

Ist zufällig jemand da, der Closures kennt und verwendet und mir das etwas beschreiben kann?


(Im C++ Tutorial hantiere ich derzeit an den Operatoren und so komme ich wieder zu dieser Frage.
Gehe ich recht in der Annahme, dass ein Closure einem Functor entspricht, der als Singleton implementiert ist?)

Re: Closures

Verfasst: Do Feb 25, 2010 6:24 pm
von Dirty Oerti
Laut Wiki ist das vergleichbar mit statischen Variablen in C ...
Also einfach "lokale Variablen", die nicht durch verlassen ihres Kontextes gelöscht werden...?

Re: Closures

Verfasst: Do Feb 25, 2010 6:26 pm
von Xin
Dirty Oerti hat geschrieben:Laut Wiki ist das vergleichbar mit statischen Variablen in C ...
Also einfach "lokale Variablen", die nicht durch verlassen ihres Kontextes gelöscht werden...?
Was einem Functor-Singleton entspräche, sofern hierfür die Parameter in die Member kopiert werden.

Ich weiß, was ich mit einem Functor-Singleton machen kann... aber ich finde das jetzt nicht so spannend, um dafür einen Begriff wie Closure zu hypen?
Was übersehe ich?

Re: Closures

Verfasst: Do Feb 25, 2010 8:40 pm
von cloidnerux
Was übersehe ich?
Soweit wie ich das gesehen habe, versucht man mit Closures die Nutzung von Variablen außerhalb ihres Scopes, also der versuch locale auf Halb-Globale Variablen Hochzupushen, eben Vergleich mit Statischen Variablen in C, eben nicht mit C++-Klassen.
Mit deinem Functor-Singleton aber versuchst du Klassen und Funktionen bestimte Möglichkeiten einzuräumen, zumindest verstehe ich das so.

Re: Closures

Verfasst: Do Feb 25, 2010 10:20 pm
von Xin
cloidnerux hat geschrieben:
Was übersehe ich?
Soweit wie ich das gesehen habe, versucht man mit Closures die Nutzung von Variablen außerhalb ihres Scopes, also der versuch locale auf Halb-Globale Variablen Hochzupushen, eben Vergleich mit Statischen Variablen in C, eben nicht mit C++-Klassen.
Mit deinem Functor-Singleton aber versuchst du Klassen und Funktionen bestimte Möglichkeiten einzuräumen, zumindest verstehe ich das so.
Beim Functor komme ich doch auch an die Variablen heran, die diese Instanz liefert.

Wozu ist es sinnvoll, lokale Variablen von außen zu erreichen?

Re: Closures

Verfasst: Fr Feb 26, 2010 12:15 am
von Kerli
Xin hat geschrieben:Wozu ist es sinnvoll, lokale Variablen von außen zu erreichen?
Auf den ersten Blick hat mich das irgendwie auch gewundert, aber nach ein paar Nachforschungen erscheint mir das eigentlich gar nicht so schlecht - zumindest so wie es im kommenden C++ Standard sein wird. Dabei werden als Closure jene Variablen bezeichnet die sich im Scope der Definition einer Lambda-Funktion befinden. Damit kann man dann zum Beispiel sehr leicht und übersichtlich Operationen auf einem Container durchführen:

Code: Alles auswählen

std::vector<int> someList;
int total = 0;
std::for_each(someList.begin(), someList.end(), [&total](int x) {
  total += x;
});
std::cout << total;
In diesem Beispiel wird aus der Lambda-Funktion beim Kompilieren ein Closure in dem sie Zugriff auch auf 'total' hat. Dabei ist es aber wichtig, dass davor '[&total] steht, da man dadurch auch wirklich auf die Referenz von 'total' Zugriff hat und nicht so wie ohne dem nur der Wert in der Closure gespeichert wird. Übrigens wird das vom g++-4.5 bzw. VS 10 bereits unterstützt.

Ich weiß nicht ob meine Erklärungen ganz klar und verständlich waren, aber es lohnt sich sicher in den Standard und auf Wikipedia das ganze noch einmal nachzulesen:

http://www.open-std.org/jtc1/sc22/wg21/ ... /n1968.pdf
http://www.open-std.org/jtc1/sc22/wg21/ ... /n2550.pdf
http://en.wikipedia.org/wiki/C%2B%2B0x# ... xpressions