Vorlagenargumentabzug für Lambdas

8

Ich versuche, eine Hilfsfunktion zu machen, die eine lambda / std :: -Funktion ausführt, wenn sie aufgerufen wird, wenn der angegebene weak_ptr gültig ist. Derzeit funktioniert der folgende Code, aber leider muss ich die Template-Parameter definieren. Ich suche nach einer Möglichkeit, dies mit automatischer Vorlage Argumentabzug zu tun.

%Vor%

Idealerweise möchte ich std::function <void(ArgumentTypes...)> durch einen generischen Template-Parameter FunctorType ersetzen, aber ich bin mir nicht sicher, wie ich Argumente aus FunctorType extrahieren würde. Der obige Code funktioniert, der folgende Code ist theoretisch:

%Vor%

Gibt es eine Möglichkeit, so etwas zu tun?

    
Axiverse 30.07.2013, 21:25
quelle

3 Antworten

5

Der einfachste Weg, um Ihr Problem mit dem Extrahieren von Argumenten aus Ihrem Parameter zu lösen, besteht darin, die Argumente nicht aus Ihrem Parameter zu extrahieren.

%Vor%

viel davon wird in C ++ 14 einfacher sein.

Nebenbei bemerkt scheint es einen grundsätzlichen Konstruktionsfehler zu geben: Der bedingte Weiterleiter sollte wahrscheinlich ein .lock() auf dem weak_ptr erhalten und dann functor innerhalb dieser Sperre ausführen, so dass die Voraussetzung (dass die Ressource gehalten wird) gilt für den gesamten Aufruf von functor .

Ich bin mir auch nicht sicher, warum Sie einen Verweis auf ein weak_ptr halten, wenn der entfernte Zustand eines weak_ptr kopiert werden kann.

In C ++ 14 können Sie etwas wie folgt zurückgeben:

%Vor%

Ich glaube, und das decltype Zeug verschwindet auch meistens, da Funktionen ihren Rückgabetyp leichter ableiten können.

    
Yakk 30.07.2013, 23:54
quelle
2

So würde ich Ihr Problem in C ++ 14 lösen:

%Vor%

Ich verwende hier zwei C ++ 14 Features:

  • Abgeleiteter Rückgabetyp für make_dependent
  • Ein variadisches generisches Lambda mit perfekter Weiterleitung zum Aufruf des inneren functor

BEARBEITEN: Der obige Code erfasst dependent als Referenz, wie es bei Ihrem ursprünglichen Code der Fall war. Ist das wirklich was du willst?

    
Richard Smith 01.08.2013 06:10
quelle
1

Sie können eine Proxy-Merkmalsklasse verwenden, um den Rückgabetyp und die Argumente getrennt von einem einzelnen Vorlagenparameter zu extrahieren. Die Klasse Trait verwendet die statische Funktion dependent_func , um das Lambda zu erstellen, das Sie zurückgeben möchten.

%Vor%

Weitere Informationen zum Analysieren von Vorlagenargumenten auf diese Weise finden Sie unter folgender Frage: C ++ Template-Argument vom Typ "Funktion" analysieren

    
Snps 31.07.2013 00:42
quelle

Tags und Links