Ich versuche, eine Funktionsvorlage (in C ++ 11) zu implementieren, deren Parameter ein Lambda mit beliebigen Parametern ist, und gebe ein kompatibles std :: function-Objekt zurück. Das Ziel ist, dass die zurückgegebene Funktion asynchron aufgerufen wird, um das ursprüngliche Lambda asynchron aufzurufen, aber für den Moment gebe ich nur das ursprüngliche Lambda zurück.
Das Problem besteht einfach darin, dass der Compiler ein Lambda als Parameter der Funktionsvorlage akzeptiert. Hier sind einige einfache Vorlagen:
%Vor% Sie machen das gleiche, nur dass pass1
nur für Einzelparameter-Funktoren funktioniert, während passn
eine beliebige Zahl annimmt.
Nun versuchen wir sie zu benutzen, zuerst pass1
:
Das funktioniert nicht; Der Compiler kann anscheinend nicht sagen, welche Parameter das Lambda annimmt. Clang Fehlermeldung ist:
%Vor%Ich kann das umgehen, indem ich den Template-Parametertyp explizit festlege:
%Vor% Diese Problemumgehung schlägt jedoch mit passn
fehl:
Das Seltsame ist, dass ich % passn
aufrufen kann, wenn ich ein function
-Objekt übergebe:
... tatsächlich muss ich nicht einmal den Vorlagenparametertyp angeben:
%Vor% Die Funktion, die ich tatsächlich brauche, wird wie passn
sein, aber ich möchte nicht, dass ich bei jedem Aufruf ein function
-Objekt um das Lambda wickeln muss. Fehle ich etwas oder ist das einfach nicht möglich? Wäre es in C ++ 14 möglich?
Sie können diese Implementierung von passn
verwenden:
( Demo )
Es wird angenommen, dass Sie einen Typ mit einem operator()
übergeben. Es nimmt die Adresse dieser Funktion und leitet Parameter von diesem Mitgliedszeiger ab.
Die Funktion wird fehlschlagen, wenn Sie ihr ein Objekt übergeben, das mehrere operator()
s hat, weil dann ihre Adresse mehrdeutig ist, aber lambdas wird dieses Problem nicht erzeugen.