Chamar a função de modelo sem <>; inferência de tipo

Se eu tiver um modelo de função comtypename T, onde o compilador pode definir o tipo por si só, não preciso escrever o tipo explicitamente quando chamo a função, como:

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> 

Mas se eu tiver um modelo de função com dois tipos de nomes diferentes, como:

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>

É verdade que eu sempre tenho que especificar pelo menos 1 typename? Presumo que o motivo seja porque o C ++ não pode distinguir funções entre diferentes tipos de retorno.

Mas se eu usar uma função void e entregar uma referência, novamente não devo especificar explicitamente o nome do tipo de retorno:

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>

Caso a conclusão seja evitar funções com retorno e mais preferirvoid funções que retornam através de uma referência ao escrever modelos? Ou existe a possibilidade de evitar escrever explicitamente o tipo de retorno? Algo como "inferência de tipo" para modelos. É possível "inferência de tipo" em C ++ 0x?

questionAnswers(3)

yourAnswerToTheQuestion