Aufruf der Vorlagenfunktion ohne; Tipp Inferenz

8

Wenn ich eine Funktionsvorlage mit typename T habe, wo der Compiler den Typ selbst bestimmen kann, muss ich den Typ nicht explizit schreiben, wenn ich die Funktion wie folgt aufrufen:

%Vor%

Aber wenn ich eine Funktionsvorlage mit zwei verschiedenen Typnamen habe wie:

%Vor%

Stimmt es, dass ich immer mindestens einen Typnamen angeben muss? Ich nehme an, der Grund ist, weil C ++ Funktionen zwischen verschiedenen Rückgabetypen nicht unterscheiden kann.

Aber wenn ich eine void-Funktion verwende und eine Referenz übergebe, darf ich den Rückgabetypenamen nicht explizit angeben:

%Vor%

Sollte die Schlussfolgerung darin bestehen, Funktionen mit Rückgabe zu vermeiden und lieber void -Funktionen, die beim Schreiben von Vorlagen über eine Referenz zurückkommen? Oder gibt es eine Möglichkeit zu vermeiden, den Rückgabetyp explizit zu schreiben? Etwas wie "Inferenz eingeben" für Vorlagen. Ist "Typ-Inferenz" in C ++ 0x möglich?

    
OlimilOops 14.05.2010, 11:26
quelle

3 Antworten

12

Die Überladungsauflösung erfolgt nur basierend auf Funktionsargumenten; Der Rückgabewert wird überhaupt nicht verwendet. Wenn der Rückgabetyp nicht basierend auf den Argumenten ermittelt werden kann, müssen Sie ihn explizit angeben.

Ich würde nicht den Weg des "Zurückgebens" eines Wertes durch einen Referenzparameter gehen; das macht den Anrufcode unklar. Zum Beispiel würde ich das bevorzugen:

%Vor%

darüber:

%Vor%

weil es im letzteren Fall leicht ist, Eingabe und Ausgabe zu verwechseln, und es ist überhaupt nicht klar, dass x geändert wird.

Im speziellen Fall von round benötigen Sie wahrscheinlich sowieso nur ein oder zwei Typen für TOut , also können Sie das Template-Argument einfach weglassen:

%Vor%

Ich finde roundToInt(x) etwas klarer als round<int>(x) , weil klar ist, wofür der int Typ verwendet wird.

    
Thomas 14.05.2010, 11:31
quelle
3
  

Die Schlussfolgerung ist, Funktionen mit return zu vermeiden und mehr Void-Funktionen, die über eine Referenz beim Schreiben von Vorlagen zurückgeben

Nein, warum? Was gewinnst du? Geben Sie nur Inferenz ein (also weniger Code zum Schreiben). Aber Sie verlieren die viel logischere Syntax der Zuweisung eines Werts (und folglich mehr Code zum Schreiben). Also eine Sache gewonnen, eine andere verloren. Ich sehe den Nutzen im Allgemeinen nicht.

Es kann sogar helfen , den Schablonentyp explizit anzugeben: Betrachten Sie den Fall von lexical_cast . Wenn Sie den Typ der Rückgabemaske nicht angeben, ist das verwirrend.

    
Konrad Rudolph 14.05.2010 11:39
quelle
2

Lassen Sie mich hinzufügen, was die anderen gesagt haben, indem Sie sagen, dass Sie C ++ - Casting im C-Stil bevorzugen.

%Vor%

versus

%Vor%

static cast schlägt immer fehl, wenn Sie versuchen, nicht verwandte Typen zu konvertieren. Dies kann beim Debuggen helfen.

    
wheaties 14.05.2010 11:55
quelle

Tags und Links