L'appel de fonction de modèle sans <>; l'inférence de type

Si j'ai un modèle de fonction avec typename T, où le compilateur peut définir le type en lui-même, je n'ai pas à écrire le type de manière explicite lorsque j'appelle la fonction comme:

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> 

Mais si j'ai un modèle de fonction avec deux typenames comme:

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>

Est-il vrai que j'ai toujours spécifier au moins 1 typename? Je suppose que la raison est parce que le C++ ne peut pas distinguer les fonctions entre les différents types de retour.

Mais si j'utilise une fonction void et la remise d'une référence, encore une fois je ne doit pas spécifier explicitement le retour typename:

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>

Si la conclusion est d'éviter de fonctions avec le retour et la plus préfèrent void fonctions qui renvoient par l'intermédiaire d'une référence lors de l'écriture de modèles? Ou est-il une possibilité pour éviter écrivant explicitement le type de retour? Quelque chose comme "l'inférence de type" pour les modèles. Est "l'inférence de type" possible en C++0x?

La conversion entre les types de l'inférence de type idée difficile à gérer, vous ne pouvez donc pas de surcharge sur les types de retour et doit spécifier quand c'est un paramètre du modèle.
Vous pourriez vouloir travailler sur votre algorithme arrondi. Ce qui devrait -1.54 en sortir? Et: que faire si vous voulez obtenir un arrondi double de la valeur?

OriginalL'auteur OlimilOops | 2010-05-14