Ich arbeite gerade an einer Bibliothek, in der ich Funktionsobjekte verkette.
Ich erstelle eine Funktionsvorlage, die ein Callable Object (std :: function im Moment) übernimmt und am Ausgangs- und Eingabetyp der Funktion parametrisiert ist. Hier ist eine vereinfachte Version dessen, was ich definiere:
%Vor%Das Problem, das ich habe, liegt in der Nutzung. Es scheint, dass der Compiler, wenn ich ein Lambda übergebe, den Typ nicht korrekt ableiten kann, also beschwert sich, dass die Funktion nicht existiert:
%Vor% Wenn ich das Lambda explizit in std::function
einpacke, kompiliert das Programm:
Ich habe noch nicht Funktionszeiger oder Funktionsobjekte übergeben, aber es scheint für den Compiler schwierig zu sein, die Parameter In
und Out
abzuleiten, wenn ich die explizite% co_de nicht direkt übergebe % Objekt.
Meine Frage ist: Gibt es eine Möglichkeit, dies zu umgehen, so dass ich den Eingabe- / Rückgabetyp eines aufrufbaren Objekts ableiten kann, ohne sie an der Aufrufseite explizit zu erwähnen?
Vielleicht parametrisieren Sie die Vorlage für den Funktionstyp anstelle der Eingabe- / Rückgabetypen? Im Wesentlichen muss ich den std::function
und In
Typ für eine beliebige Callable ableiten. Vielleicht eine Art von Out
/ auto
Trick für den Rückgabetyp der Template-Funktion?
Danke.
Ich denke, was Sie tun können, ist eine intermediäre Rückgabetyp-Deduktionsfunktion, die decltype
verwendet, um die Argumente zu bestimmen, die an das tatsächliche Funktionsobjekt übergeben werden:
Natürlich können Sie die Implementierung der Logik in process()
trotzdem in Erwägung ziehen, es sei denn, es gibt einen Grund, den Funktionstyp zu löschen.
gibt es eine Möglichkeit, dies zu umgehen, so dass ich den Eingabe- / Rückgabetyp eines aufrufbaren Objekts ableiten kann, ohne sie explizit an der Aufrufstelle zu erwähnen?
Nein. Benutzerdefinierte Konvertierungen werden in der Argumentableitung von Vorlagen nicht berücksichtigt. Der Compiler muss mit In
und Out
kommen, so dass der Typ des Parameters und der Typ des Arguments (fast) genau übereinstimmen müssen, aber in diesem Fall werden sie das nie tun.
Vielleicht parametrisieren Sie die Vorlage für den Funktionstyp anstelle der Eingabe- / Rückgabetypen
Ja, das ist normalerweise der Fall (schauen Sie sich zum Beispiel die Algorithmen der Standardbibliothek an)
Tags und Links c++ c++11 templates std-function