39. C++ || Funciones plantillas




Las plantillas de funciones son una de las propiedades más importante que tiene C++, con su uso podemos crear funciones genéricas que acepten cualquier tipo de dato en sus parámetros, si C++ no contara con esta propiedad, nos veríamos obligados a tener que escribir una función una y otra vez, generando código repetido.

Las plantillas son muy usadas en la programación y se emplean cuando se necesita utilizar la misma función pero con diferentes argumentos. Por ejemplo, supongamos que tenemos una función que obtiene el valor absoluto de un número, si refrescamos la memoria, sabemos que el valor absoluto de x siempre será x, es decir, si x es negativo, su valor absoluto será el mismo número pero en positivo, si x es positivo, su valor absoluto será el mismo. Una función que haga esto sería la siguiente:

int valorAbsoluto(int numero){
return (numero < 0)? -numero : numero;
}

Ok, pero tenemos un problema, con esta función podemos obtener el valor absoluto de un número, pero sólo de un entero. Esto está mal porque sabemos que hay más tipos de números. Para aceptar otros tipos de datos como un float, double, long lo que podríamos hacer sería sobrecargar la función, pero vaya que no será lo más idóneo, es por eso que para este tipo de casos C++ proporciona un mecanismo más ágil y potente, las plantillas de funciones. Así que el lugar de escribir las cuatro funciones, lo que haremos sería lo siguiente:

template <class tipo> 
tipo valorAbsoluto(tipo numero){
return (numero < 0)? -numero : numero;
}

La palabra reservada template indica al compilador que estamos haciendo uso de una plantilla de función. El símbolo tipo indica al compilador que puede ser sustituido por cualquier tipo de dato apropiado: int, float, double, etc. El nombre de tipo puede ser cualquiera que queramos, siempre respetando que no sea una palabra reservada. Por ejemplo:

template <class T>
T ejemploDeFuncion(T parametro1, T parametro2){
//Código de la función
}

Pero también podemos usar plantillas de funciones de la siguiente manera:

template <class T1, class T2>
T2 ejemploDeFuncion(T1 parametro1, T2 parametro2){
//Código de la función
}

Algo que debemos tener en cuenta cuando hagamos uso de una plantilla de función es que la palabra template debe aparecer arriba del prototipo de la función así como también arriba de la definición de la función. Veamos un mejor ejemplo:


#include <iostream>

using namespace std;

template <class P>
P valorAbsolutoDeUnNumero(P numero);

int main()
{
   int entero          = -323;
   long largo          = -838237237;
   float real          = -3.1454;
   double realDoble    = -0.232352;

   cout<<valorAbsolutoDeUnNumero(entero)<<endl;
   cout<<valorAbsolutoDeUnNumero(largo)<<endl;
   cout<<valorAbsolutoDeUnNumero(real)<<endl;
   cout<<valorAbsolutoDeUnNumero(realDoble)<<endl;

    return 0;
}

template <class P>
P valorAbsolutoDeUnNumero(P numero){
return (numero < 0)? -numero : numero;
}




1 comentario:

  1. Gracias por la explicacion es muy didactica y sencilla para comprender

    ResponderEliminar