Documente Academic
Documente Profesional
Documente Cultură
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.
// L.1
// L.2
foo (i)
A a;
foo (a);
B b;
foo (b);
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
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: