Verwendung von Lambdas in der Vorlagenklasse

8

Ich versuche eine Template-Klasse mit einem Lambda-Funktionsparameter zu verwenden. Ich verstehe jedoch nicht, wie der Parameter übergeben wird. Folgendes habe ich bisher versucht:

%Vor%

Ich bekomme einen Fehler in der markierten Zeile.

Kann jemand helfen?

    
Ofer Magen 03.09.2016, 16:20
quelle

3 Antworten

6

Ihr Beispiel funktioniert nicht, weil F ein Typ und kein aufrufbares Objekt ist. Der nächste Schritt besteht in der Instantiierung durch Erstellen einer Elementvariablen.

%Vor%

Dies funktioniert jedoch immer noch nicht, da Lambda-Standardkonstruktoren gelöscht werden. Das bedeutet, dass wir einen anderen Weg brauchen, um function zu konstruieren. Dies kann erreicht werden, indem ein Argument an den Konstruktor von A übergeben wird.

%Vor%

Dies verwendet den lambda-Kopierkonstruktor, der nicht gelöscht wird.

Live-Beispiel

Wenn Sie möchten, dass es mit jedem Lambda funktioniert, können Sie noch mehr Magie hinzufügen.

%Vor%

Live-Beispiel

    
Nelfeal 03.09.2016 17:04
quelle
3

Wenn Sie wirklich eine Vorlage verwenden möchten, um jede Art von Funktionssignatur zu akzeptieren, sollte die Implementierung etwas Ähnliches sein:

%Vor%

Das, weil Sie im Kommentar gesagt haben:

  

F: Wird der Typ F in der Klasse nur für die Methode f benötigt?
  A: nur die Methode .

Aus diesem Grund sollte es nutzlos sein, eine Vorlagenklasse zu haben, wenn Sie nur eine Vorlagenmethode haben können.

Hier ein Beispiel, wie die Methode aufgerufen wird, die das aufrufbare Objekt "mit seinen Parametern" aufruft, in diesem Fall eine Lambda-Funktion:

%Vor%

Praktisch akzeptiert die Methode f als erstes Argument ein " Callable Object " und als weitere Argumente alle Parameter, die angefordert werden, um das erste Argument aufzurufen.

Zusätzliche Hinweise:

Wenn Sie der Methode f eine bestimmte Art von Signatur der Funktion übergeben möchten, zum Beispiel: int (*)(int) , dann können Sie die Verwendung der Vorlage vermeiden und ein Objekt vom Typ std::function übergeben.

Dies ist nur ein Beispiel:

%Vor%     
Biagio Festa 03.09.2016 16:33
quelle
2

Es reicht nicht aus, A so zu definieren, wie es von einer Lambda-Funktion abgeleitet ist oder diese irgendwie enthält, Sie müssen das Unterobjekt dennoch initialisieren, wenn Sie eine Instanz von A erstellen.
Um das zu tun, können Sie als Beispiel von Lambda erben und A als aufrufbares Objekt verwenden.
Es folgt ein minimales, funktionierendes Beispiel:

%Vor%

Sie müssen keine Funktion f zu ausführen das Lambda definieren.
Wenn Sie jedoch eine Funktion f haben wollen, die als a.f(5) aufgerufen werden soll, können Sie sie wie folgt definieren:

%Vor%

Oder wie folgt:

%Vor%     
skypjack 03.09.2016 17:16
quelle

Tags und Links