Si tengo una plantilla de función con typename T
, donde el compilador puede establecer el tipo por sí mismo, no tiene que escribir el tipo de forma explícita cuando llamo a la función como:Función de plantilla de llamada sin <>; inferencia de tipos
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>
Pero si tengo una plantilla de función con dos typenames 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>
¿es cierto que siempre tengo que especificar al menos 1 nombretipo? Supongo que la razón es porque C++ no puede distinguir funciones entre diferentes tipos de retorno.
Pero si uso una función nula y la entrega de una referencia, de nuevo, no tienen que especificar el nombre de 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>
En caso de que la conclusión sea para evitar funciones con retorno y más prefieren void
funciones que devuelven a través una referencia al escribir plantillas? ¿O existe la posibilidad de evitar escribir explícitamente el tipo de devolución? Algo así como "tipo de inferencia" para plantillas. ¿Es posible la "inferencia de tipo" en C++ 0x?
Conversiones entre tipos hace que la idea de inferencia de tipos difícil de manejar, por lo que no se puede sobrecargar el tipo de retorno y debe especificar cuando se trata de un parámetro de plantilla. – Francesco
Es posible que desee trabajar en su algoritmo de redondeo. ¿Qué debería sacar -1.54? Y: ¿y si quieres obtener un valor ** ** ** redondeado? – UncleBens