Unterschied zwischen C ++ 0x lambdas und operator (), closure und funktor

8

Ich bin zuversichtlich, dass ich den allgemeinen Kern der Konstrukte bekomme, aber ich kann den Zweck von ihnen in c ++ nicht sehen. Ich habe die vorherigen Beiträge zum Thema hier auf SO und anderswo gelesen, aber ich verstehe nicht, warum sie ein neues Sprachfeature sein sollten.

Die Dinge, die ich gerne beantwortet hätte, ist so

  • Was ist der Unterschied zwischen einem Lambda und einem Template-Argument, das eine Funktion / einen Funktor akzeptiert?

  • Ist ein Abschluss nur ein Funktor mit einem bestimmten Objektstatus (Bereich?)?

  • Was ist die "Killer-App" für diese Konstrukte? oder vielleicht der typische Anwendungsfall?
Captain Giraffe 10.01.2011, 21:00
quelle

2 Antworten

17

Lambdas sind wirklich nur syntaktischer Zucker für einen Funktor. Sie könnten alles selbst machen: Definieren Sie eine neue Klasse, machen Sie Membervariablen, die die erfassten Werte und Referenzen enthalten, hängen Sie sie im Konstruktor an, schreiben Sie operator()() und erstellen Sie schließlich eine Instanz und übergeben Sie sie. Oder Sie könnten ein Lambda verwenden, das 1/10 so viel Code hat und dasselbe funktioniert.

Lambdas, die nicht erfassen, können in Funktionszeiger umgewandelt werden. Alle lambdas können in std::function konvertiert werden, oder sie erhalten ihren eigenen eindeutigen Typ, der gut in Templates funktioniert, die einen Funktor akzeptieren.

    
Ben Voigt 10.01.2011, 21:08
quelle
10

Ok, Sie stellen tatsächlich eine Reihe verschiedener Fragen, möglicherweise weil Sie mit der Terminologie nicht vertraut sind. Ich werde versuchen, alles zu beantworten.

Was ist der Unterschied zwischen einem Lambda und "operator ()"? - Lassen Sie uns das folgendermaßen umschreiben: "Was ist der Unterschied zwischen einem Lambda und einem Objekt mit Operator ()?"

Im Grunde nichts. Der Hauptunterschied besteht darin, dass ein Lambda-Ausdruck ein funktionales Objekt erzeugt, während ein Objekt mit einem Operator () ein funktionales Objekt ist. Das Endergebnis ist ähnlich genug, um dasselbe zu berücksichtigen, eine Entität, die mit der Syntax (params) aufgerufen werden kann.

Was ist der Unterschied zwischen einer Schließung und einem Funktor? Dies ist auch ziemlich verwirrt. Bitte überprüfen Sie diesen Link:

Ссылка Ссылка

Wie Sie sehen können, ist eine Closure also eine Art "Funktor", der in einem Bereich definiert ist, in dem er die Variablen aufnimmt, die ihm in diesem Bereich zur Verfügung stehen. Mit anderen Worten, es ist eine Funktion, die während des Betriebs des Programms während des Betriebs des Programms erstellt wird, und dieser Aufbauprozess wird durch die Laufzeitwerte des Bereichs, der es enthält, parametrisiert. In C ++ - Closures sind also Lambdas, die Werte innerhalb der Funktion verwenden, die das Lambda aufbauen.

Was ist der Unterschied zwischen einem Lambda und einem Template-Argument, das eine Funktion / einen Funktor akzeptiert? - Das ist wieder verwirrt. Der Unterschied ist, dass sie einander nicht ähnlich sind. Ein Template "Argument", das eine Funktion / einen Funktor akzeptiert, ist bereits eine verworrene Formulierung, daher nehme ich an, dass mit "Argument" du "Funktion" meinst, weil Argumente nichts akzeptieren. In diesem Fall kann ein Lambda zwar einen Funktor als Argument akzeptieren, aber nicht als Templat. Zwei, in der Regel wird das Lambda als Argument für eine Funktion übergeben, die ein Funktor-Argument akzeptiert.

Ist ein Abschluss nur ein Funktor mit einem bestimmten Objektstatus (Bereich?)?

Wie Sie oben sehen können, nein. Tatsächlich hat eine Schließung nicht einmal einen Zustand, wirklich. Eine Schließung basiert auf dem Zustand einer anderen Entität, die sie aufgebaut hat, innerhalb dieses Funktors, obwohl dies kein Zustand ist, ist es genau die Konstruktion des Objekts.

Was ist die "Killer-App" für diese Konstrukte? oder vielleicht der typische Anwendungsfall?

Ich werde das umschreiben auf: "Warum sind diese Dinge nützlich?"

Nun, im Allgemeinen ist die Fähigkeit, jedes Objekt als eine Funktion zu behandeln, wenn es operator () hat, extrem nützlich für eine ganze Reihe von Dingen. Zum einen erlaubt es uns, das Verhalten eines beliebigen stdlib-Algorithmus zu erweitern, indem wir entweder Objekte oder freie Funktionen verwenden. Es ist unmöglich, das enorme Angebot an nützlichen Mitteln zu enthüllen.

Genauer gesagt machen Lambda-Ausdrücke diesen Prozess einfach einfacher. Die Einschränkungen, die durch Objektdefinitionen auferlegt wurden, machten den Prozess der Verwendung von stdlib-Algorithmen in einigen Fällen leicht ineffizient (aus Sicht der Entwicklungsnutzung, nicht der Programm-Effizienz). Zum einen musste zu der Zeit zumindest jedes Objekt, das als Parameter an eine Vorlage übergeben wurde, extern definiert werden. Ich glaube, das ändert sich auch, aber trotzdem ... ganze Objekte zu erstellen, nur um grundlegende Dinge zu tun, die nur an einem Ort verwendet werden, ist unbequem. Lambda-Ausdrücke erlauben diese Definition ziemlich einfach zu sein, im Rahmen des Ortes, an dem sie benutzt wird, usw., etc ...

    
Crazy Eddie 10.01.2011 21:22
quelle

Tags und Links