Wenn ich eine Funktion Vorlage mit typename T
haben, wo der Compiler den Typ von selbst einstellen kann, muss ich den Typ nicht explizit schreiben, wenn ich die Funktion wie nennen:Aufruf der Vorlagenfunktion ohne <>; Typinferenz
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 Funktionsschablone mit zwei verschiedenen typenames 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 mindestens 1 Typnamen immer angeben muß? Ich nehme an, der Grund ist, weil C++ Funktionen zwischen verschiedenen Rückgabetypen nicht unterscheiden kann.
Aber wenn ich eine Lücke Funktion und Übergabe eine Referenz verwenden, wieder muß ich nicht explizit die Rückkehr Typname 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 Abschluss-Funktionen zu vermeiden, mit Rückgabe- und mehr bevorzugt void
Funktionen, die über das Rück eine Referenz beim Schreiben von Vorlagen? 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?
Durch die Umwandlung zwischen Typen wird die Typinferenz-Idee unübersichtlich, sodass Sie die Rückgabetypen nicht überladen können und sie angeben müssen, wenn es sich um einen Vorlagenparameter handelt. – Francesco
Sie möchten vielleicht an Ihrem Rundungsalgorithmus arbeiten. Was sollte -1.54 als herauskommen? Und: Was ist, wenn Sie einen abgerundeten ** doppelten ** Wert erhalten möchten? – UncleBens