Você está na página 1de 3

Las plantillas.

Permiten declarar funciones o clases dejando sin especificar el tipo de algunos de sus
parmetros y/o datos (en el caso de funciones) o el tipo de algunos de sus miembros (en el
caso de las clases).
El uso de plantillas es apropiado para definir contenedores, es decir estructuras que sirven
para almacenar una coleccin de objetos (una lista, un vector, un grafo)


Las plantillas tambin son apropiadas para definir algoritmos genricos que se aplican a
una familia de clase. Por ejemplo, es interesante codificar un algoritmo del camino ms
corto, independientemente de la estructura del grafo. El uso de un functor puede ser
apropiado para acceder a los pesos instalados sobre los arcos del grafo en este caso. La
clase de grafo pasada como parmetro debe cumplir un cierto nmero de pre-requisitos
para que el algoritmo pueda ser aplicado. Si no, el programa no compilar

Plantillas de funciones.

Una plantilla de funcin es un modelo de funcin que el compilador de C++ usar para
construir diferentes versiones de una misma funcin, segn los tipos de datos que se
especifiquen al invocar la misma. La plantilla permite escribir funciones que difieren
exclusivamente en el tipo de datos que manejan.
Para definir una plantilla de funcin se utiliza la siguiente sintaxis:



template = palabra reservada
Ti = Tipo de dato genrico

Ejemplo para la plantilla funcin generica:

#include <iostream>
#include <math.h>
#include<stdlib.h>
using namespace std;
// El objetivo de esta plantilla es encontrar el mayor de dos valores dados
template <class T> T Max(T Val1, T Val2)
{ if (Val1 > Val2)
return Val1;
else
return Val2; ;
}
// El objetivo de esta plantilla es calcular la raz cuadrada de un valor dado.
template <class T> double Raiz(T Num)
{ return sqrt(Num);
}
main ( )
{ cout << "Prueba de la plantilla de funcion Max " << endl << endl;
// En las siguientes lneas se invocan las distintas versiones de la funcin Max
cout << "El maximo de 2 y 5 es: " << Max(2, 5) << endl;
template <class T1, class T2,, class
Tn>;
cout << "El maximo de 5.23 y 6.98 es: " << Max(5.23, 6.98) << endl;
cout << "El maximo de 'g' y 'q' es: " << Max('g', 'q') << endl;
cout << endl << endl;
cout << "Prueba de la plantilla de funcion Raiz " << endl << endl;
// En las siguientes lneas se invocan las distintas versiones de la funcin Raiz
cout << "La Raiz de 8 es: " << Raiz(8) << endl;
cout << "La Raiz de 22.8 es: " << Raiz(22.8) << endl;
system("pause > nul");
}



Plantillas de clases.
Las plantillas de clases permiten definir versiones de una misma clase que difieren en el
tipo de dato de algunos de sus miembros. Es decir, se crea el modelo de una clase el cual
permitir definir distintas instancias de la misma para diferentes tipos de datos.
Para declarar una plantilla de clase se usan las palabras reservadas template y class
T.
El tipo T se usa en aquellos miembros de la clase cuyos tipos tomarn un valor en el
momento de crear los objetos.

A continuacin se muestra la sintaxis que se utiliza para definir una plantilla de clase:
template <class T>
class <Nombre de la Plantilla de clase>
{ private:
T Atributo;
// datos miembros de la clase
public:
PlantillaClase( );
T Metodo1 ( );
void Metodo2 (T valor); // funciones miembros de la clase

};

Para declarar un objeto, a partir de una plantilla de clase, se aplica la siguiente sintaxis:

PlantillaClase <tipo > Nombre del objeto;
tipo= indica el tipo de dato que reemplazar todas las ocurrencias de T en la definicin
de la clase.
Por ejemplo, si quisiera declarar dos objetos de tipo PlantillaClase, pero uno con el tipo
int
como tipo de dato, y otro con float, entonces haramos lo siguiente:

PlantillaClase <int> Objeto1:
PlantillaClase <float> Objeto2:



Para Objeto1, el atributo, el resultado del Metodo1 y el parmetro del Metodo2 sern de
tipo
int, mientras que para el Objeto2, el atributo, el resultado del Metodo1 y el parmetro del
Metodo2 sern de tipo float.

En cuanto a la definicin de mtodos, la sintaxis que se aplica es:
template <class T>
T Plantilla de clase <T> :: Metodo1( )
{ // cuerpo de mtodo
}
En este caso, el mtodo de la clase da un resultado de tipo T. Por lo tanto, el tipo de
resultado se definir en el momento de crear un objeto de dicha clase.
Para el mtodo2 sera as:
template <class T>

void Plantilla de clase <T> :: Metodo2(T valor)
{ // cuerpo de mtodo
}
En este caso, el mtodo recibe un parmetro que ser del tipo T. Por lo tanto, el tipo
seespecifica en el momento de declarar el objeto.

Ventajas:

- la generalizacin: desde el momento en que el tipo incluye todo lo que es utilizado en la
funcin o clase-plantilla, es posible pasar cualquier tipo como parmetro.
- simplicidad: nicamente se codifica una funcin o clase sin importar el tipo pasado
como parmetro, lo que hace que el mantenimiento del cdigo sea ms fcil.

Desventajas:
- El uso de plantillas requiere tomar algunas precauciones (typename)
- El programa demora ms en ser compilado.








Alumno: Diego Barrera