std :: Funktion Vorlage Argumentauflösung

8

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:

%Vor%

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.

    
Alexander Kondratskiy 06.12.2012, 22:30
quelle

2 Antworten

9

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:

%Vor%

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.

    
Dietmar Kühl 06.12.2012, 22:58
quelle
8
  

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)

    
Cubbi 06.12.2012 22:41
quelle

Tags und Links