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:
Gibt es eine Möglichkeit, so etwas zu tun?
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.
So würde ich Ihr Problem in C ++ 14 lösen:
%Vor%Ich verwende hier zwei C ++ 14 Features:
make_dependent
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?
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.
Weitere Informationen zum Analysieren von Vorlagenargumenten auf diese Weise finden Sie unter folgender Frage: C ++ Template-Argument vom Typ "Funktion" analysieren