Sunteți pe pagina 1din 6

Plantillas

Las plantillas (Templates) son uno de los grandes aportes de C++ al lenguaje C.
Hasta antes de las plantillas, se pasaban variables como parmetros de las funciones.
Gracias al concepto de plantilla, es posible pasar tipos como parmetros, y de este modo
definir funciones genricas. Pero el concepto de plantillas no se limita a las funciones,
tambin puede ser utilizado en clases y estructuras.

Template (palabra-clave)
C++ utiliza una palabra clave especfica template para declarar y definir funciones y
clases genricas. En estos casos acta como un especificador de tipo y va unido al par de
ngulos < > que delimitan los argumentos de la plantilla:
template <T> void fun(T& ref); // declaracin de funcin genrica
template <T> class C {/*...*/}; // declaracin de clase genrica

Ventajas
El inters de las plantillas residen en:
-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.

Inconvenientes
-Como lo veremos a continuacin, el uso de plantillas requiere tomar algunas
precauciones (typename)
-El programa demora ms en ser compilado.

Cundo utilizar plantillas?

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 mas
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
Programacin genrica
Desde luego la POO supuso un formidable avance del arsenal de herramientas de
programacin. Incluso en algunos casos, un autntico baln de oxgeno en el desarrollo y
mantenimiento de aplicaciones muy grandes, en las que se estaba en el lmite de lo
factible con las tcnicas programacin tradicional. Sin embargo, algunos tericos seguan
centraron su atencin en los algoritmos. Algo que estaba ah tambin desde el principio.
Se dieron cuenta que frecuentemente las manipulaciones contienen un denominador
comn que se repite bajo apariencias diversas. Por ejemplo, la idea de ordenacin "Sort"
se repite infinidad de veces en la programacin, aunque los objetos a ordenar y los
criterios de ordenacin varen de un caso a otro. Alrededor de esta idea surgi un nuevo
paradigma denominado programacin genrica o funcional.
La programacin genrica est mucho ms centrada en los algoritmos que en los datos y
su postulado fundamental puede sintetizarse en una palabra: generalizacin. Significa
que, en la medida de lo posible, los algoritmos deben ser parametrizados al mximo y
expresados de la forma ms independiente posible de detalles concretos, permitiendo as
que puedan servir para la mayor variedad posible de tipos y estructuras de datos.
Los expertos consideran que la parametrizacin de algoritmos supone una aportacin a
las tcnicas de programacin, al menos tan importante, como fue en su momento la
introduccin del concepto de herencia, y que permite resolver algunos problemas que
aquella deja sin solucin.
La POO y la programacin genrica representan enfoques en cierta forma ortogonales
entre si:
La programacin orientada al dato razona del siguiente modo: representemos un tipo de
dato genrico (por ejemplo int) que permita representar objetos con ciertas caractersticas
comunes (peras y manzanas). Definamos tambin que operaciones pueden aplicarse a
este tipo (por ejemplo aritmticas) y sus reglas de uso, independientemente que el tipo
represente peras o manzanas en cada caso.
Por su parte la programacin funcional razona lo siguiente: construyamos un algoritmo
genrico (por ejemplo sort), que permita representar algoritmos con ciertas caractersticas
comunes (ordenacin de cadenas alfanumricas y vectores por ejemplo). Definamos
tambin a que tipos pueden aplicarse a este algoritmo y sus reglas de uso,
independientemente que el algoritmo represente la ordenacin de cadenas alfanumricas
o de vectores.

Con el fin de adoptar los paradigmas de programacin entonces en vanguardia, desde


sus inicios C++ haba adoptado conceptos de lenguajes anteriores. Uno de ellos, la
programacin estructurada [5], ya haba sido recogida en el diseo de su antecesor
directo C. Tambin adopt los conceptos de la POO entonces emergente. Posteriormente
ha incluido otros conceptos con que dar soporte a los nuevos enfoques de la
programacin funcional; bsicamente plantillas y contenedores. Las plantillas, que se
introdujeron con la versin del Estndar de Julio de 1998 son un concepto tomado de Ada.
Los contenedores no estn definidos en el propio lenguaje, sino en la Librera Estndar.
Sinopsis
Las plantillas ("Templates"), tambin denominadas tipos parametrizados, son un
mecanismo C++ que permite que un tipo pueda ser utilizado como parmetro en la
definicin de una clase o una funcin.
Ya se trate de clases o funciones, la posibilidad de utilizar un tipo como parmetro en la
definicin, posibilita la existencia de entes de nivel de abstraccin superior al de funcin o
clase concreta. Podramos decir que se trata de funciones o clases genricas;
parametrizadas (de ah su nombre). Las "instancias" concretas de estas clases y
funciones conforman familias de funciones o clases relacionadas por un cierto
"denominador comn", de forma que proporcionan un medio simple de representar gran
cantidad de conceptos generales y un medio sencillo para combinarlos.
Por ejemplo, supongamos las dos definiciones siguientes:
void foo (int i) { ... }

// L.1

template < class T > void foo (T t) { ... }

// L.2

La primera (L.1) es la definicin de una funcin tradicional que recibe un entero, la


segunda (L.2) es una funcin genrica que recibe un objeto de tipo T. Ms tarde, en el
cdigo podramos hacer:
int i = 128;

// una "instancia" de la clase de los enteros de valor 128

foo (i)

// invocacin de foo de L.1

A a;

// una instancia de la clase A

foo (a);

// invocacin de una versin para tipos A de foo de L.2

B b;

// una instancia de la clase B

foo (b);

// invocacin de una versin para tipos B de foo de L.2

Punto importante a entender aqu es que en realidad, foo(a) y foo(b) son invocaciones a
funciones distintas, fabricadas por el compilador a partir de la definicin (plantilla) L.2

Para ilustrarlo intentaremos una analoga: si la clase Helado-de-Fresa representara todos


los helados de fresa, de los que las "instancias" concretas seran distintos tamaos y
formatos de helados de este sabor, una plantilla Helado-de-<tipo> sera capaz de
generar las clases Helado-de-fresa; Helado-de-vainilla; Helado-de-chocolate, Etc. con
solo cambiar adecuadamente el argumento <tipo>. En realidad respondera al concepto
genrico de "Helado-de". Las instancias concretas de la plantilla forman una familia de
productos relacionados (helados de diversos sabores). Forzando al mximo la analoga
diramos "especialidades".
Advertiremos desde ahora que el mecanismo de plantillas C++ es en realidad un
generador de cdigo parametrizado. La conjuncin de ambas capacidades: generar tipos
(datos) y cdigo (algoritmos) les confiere una extraordinaria potencia. Si bien el propio
inventor del lenguaje reconoce que a costa de "cierta complejidad", debida principalmente
a la variedad de contextos en los que las plantillas pueden ser definidas y utilizadas [3].
La idea central a resaltar aqu es que una plantilla genera la definicin de una clase o de
una funcin mediante uno o varios parmetros. A esta instancia concreta de la clase o
funcin generada, se la denomina especializacin o especialidad de la plantilla.
Nota: un aspecto crucial del sistema es que los parmetros de la plantilla pueden ser
a su vez plantillas.
Para manejar estos conceptos utilizaremos la siguiente terminologa:
Clase-plantilla ("template class") o su equivalente: clase genrica.
Funcin-plantilla ("template function") o su equivalente: funcin genrica.
Instanciacin de la
plantilla
Clase genrica +
argumento/s
Funcin genrica +
argumento/s

clase concreta (especializacin)


funcin
concreta (especializacin)

Como se ha indicado, las plantillas representan una de las ltimas implementaciones del
lenguaje y constituyen una de las soluciones adoptadas por C++ para dar soporte a la
programacin genrica. Aunque inicialmente fueron introducidas para dar soporte a las
tcnicas que se necesitaban para la Librera Estndar (para lo que se mostraron muy
adecuadas), son tambin oportunas para muchas situaciones de programacin.
Precisamente la exigencia fundamental de diseo de la citada librera era lograr
algoritmos con el mayor grado de abstraccin posible, de forma que pudieran adaptarse al
mayor nmero de situaciones concretas.

El tiempo ha demostrado que sus autores realizaron un magnfico trabajo que va ms all
de la potencia, capacidad y versatilidad de la Librera Estndar C++ (STL
5.1) y de que
otros lenguajes hayan seguido la senda marcada por C++ en este sentido. Por ejemplo
Java, con su JGL ("Java Generic Library"). Lo que comenz como una herramienta para la
generacin parametrizada de nuevos tipos de datos (clases), se ha convertido por propio
derecho en un nuevo paradigma, la metaprogramacin (programas que escriben
programas).
Versiones explcitas e implcitas
De lo dicho hasta ahora puede deducirse que las funciones y clases obtenidas a partir de
versiones genricas (plantillas), pueden obtenerse tambin mediante codificacin manual
(en realidad no se diferencian en nada de estas ltimas). Aunque en lo tocante a eficacia y
tamao del cdigo, las primeras puedan competir en igualdad de condiciones con las
obtenidas manualmente. Esto se consigue porque el uso de plantillas no implica ningn
mecanismo de tiempo de ejecucin (runtime). Las plantillas dependen exclusivamente de
las propiedades de los tipos que utiliza como parmetros y todo se resuelve en tiempo de
compilacin.
No existe inconveniente para la coexistencia en un programa de ambos tipos de cdigo; el
generado automticamente por el mecanismo de plantillas y el generado de forma
manual. Nos referiremos a ellos como especialidades generadas automticamente, y
generadas por el usuario; tambin como versiones explcitas (codificadas manualmente)
e implcitas(generadas por el compilador). Veremos que para ciertos efectos el
compilador puede distinguir entre unas y otras .
Las plantillas representan un mtodo muy eficaz de generar cdigo (definiciones de
funciones y clases ) a partir de definiciones relativamente pequeas. Adems su
utilizacin permite tcnicas de programacin avanzadas, en las que implementaciones
muy sofisticadas se muestran mediante interfaces que ocultan al usuario la complejidad,
mostrndola solo en la medida en que necesite hacer uso de ella. De hecho, cada una de
las potentes abstracciones que se utilizan en la Librera Estndar est representada como
una plantilla. A excepcin de algunas pocas funciones, prcticamente el 100% de la
Librera Estndar est relacionada con las plantillas.
Ejemplo:

template <typename T1, typename T2, ... >


type_devuelve_t mi_funcion(param1_t p1,param2_t p2, ...){
...
}
Template <typename T1, typename T2, ... >
class mi_clase_t{
...
};

template <typename T1, typename T2, ... >struct mi_struct_t{...};

S-ar putea să vă placă și