Hola aguml:
Puedes hacer plantillas de funciones y plantillas de estructuras/clases.
Y si, puedes parametrizar también el tipo de retorno:
Ejemplo de una función con plantilla:
Código C++:
Ver originaltemplate <typename T>
T Duplicar (T valor)
{
return 2*valor;
}
Y la llamada:
Código C++:
Ver originalint n= 3;
cout<<Duplicar(n)<<endl;
float f=4.0298;
cout<<Duplicar(f)<<endl;
Mejor explicado está aquí:
http://c.conclase.net/curso/?cap=040
Es preferible entender primero las plantillas "básicas" y luego entender la mezcla de plantilla con redefinición de tipos como en el ejemplo de @eferion