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:
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?
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:
Ich finde roundToInt(x)
etwas klarer als round<int>(x)
, weil klar ist, wofür der int
Typ verwendet wird.
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.