Calling Template Funktion ohne <>; Typinferenz

Wenn ich eine Funktionsvorlage mit @ hatypename T, wo der Compiler den Typ selbst festlegen kann, muss ich den Typ nicht explizit schreiben, wenn ich die Funktion wie folgt aufrufe:

template < typename T > 
T min( T v1, T v2 ) {
   return ( v1 < v2 ) ? v1: v2;
}
int i1 = 1, i2 = 2; int i3 = min( i1, i2 ); //no explicit <type> 

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

template < typename TOut, typename TIn >
TOut round( TIn v ) {
   return (TOut)( v + 0.5 );
}
double d = 1.54;
int i = round<int>(d); //explicit <int>

Ist es wahr, dass ich immer mindestens 1 Typnamen angeben muss? Ich nehme an, der Grund dafür ist, dass C ++ Funktionen nicht zwischen verschiedenen Rückgabetypen unterscheiden kann.

Aber wenn ich eine void-Funktion verwende und einen Verweis übergebe, muss ich den Rückgabetypnamen erneut nicht explizit angeben:

template < typename TOut, typename TIn > 
void round( TOut & vret, TIn vin ) {
   vret = (TOut)(vin + 0.5);
}
   double d = 1.54;
   int i; round(i, d); //no explicit <int>

Sollte die Schlussfolgerung sein, Funktionen mit return zu vermeiden und bevorzugen Sievoid -Funktionen, die beim Schreiben von Vorlagen über eine Referenz zurückgegeben werden? Oder gibt es eine Möglichkeit, das explizite Schreiben des Rückgabetyps zu vermeiden? So etwas wie "Typinferenz" für Vorlagen. Ist "Typinferenz" in C ++ 0x möglich?

Antworten auf die Frage(6)

Ihre Antwort auf die Frage