So erstellen Sie eine Funktionsvorlage, die einen Funktor mit variablen Argumenten verwendet

8

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 :

%Vor%

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:

%Vor%

Das Seltsame ist, dass ich % passn aufrufen kann, wenn ich ein function -Objekt übergebe:

%Vor%

... 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?

    
Jens Alfke 08.02.2017, 22:30
quelle

1 Antwort

6

Sie können diese Implementierung von passn verwenden:

%Vor%

( 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.

    
nwp 08.02.2017 23:25
quelle

Tags und Links