Este documento describe las plantillas en C++. Las plantillas proporcionan configuraciones preestablecidas de código que agilizan el desarrollo. Las plantillas permiten definir funciones y clases genéricas que pueden aceptar distintos tipos de datos como parámetros. Algunas ventajas son la generalización y simplicidad del código. Se recomienda probar primero con clases normales antes de convertirlas en genéricas.
2. Templates
• Las plantillas o templates nos proporcionan de
manera rápida y eficaz, configuraciones
prestablecidas de diferentes códigos de
programación, agilizando y optimizando de esta
manera nuestro proyecto C++.
• Las plantillas son uno de los grandes aportes de
C++ al lenguaje C.
3. Templates
• Hasta antes de las plantillas, se pasaban variables
como parámetros de las funciones. Gracias al
concepto de plantilla, es posible pasar valores
como parámetros, y de este modo definir
funciones genéricas. Pero el concepto de
plantillas no se limita a las funciones, también
puede ser utilizado en clases y estructuras.
4. Ventajas
• Generalización: desde el momento en que el
valor incluye todo lo que es utilizado en la
función o clase-plantilla, es posible pasar
cualquier valor como parámetro.
• Simplicidad: únicamente se codifica una
función o clase sin importar el valor pasado
como parámetro, lo que hace que el
mantenimiento del código sea más fácil.
5. ¿Como utilizar los templates?
• El uso de plantillas es apropiado para definir
contenedores, es decir estructuras que sirven
para almacenar una colección de objetos (una
lista, un vector, un grafo)
• Las plantillas también son apropiadas para definir
algoritmos genéricos 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.
6. ¿Como utilizar los templates?
• 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
parámetro debe cumplir un cierto número de pre-
requisitos para que el algoritmo pueda ser aplicado.
Si no, el programa no compilará.
7. Convencion de notaciones
• Los parámetros de plantillas son generalmente
escritos en mayúsculas (mientras que los otros tipos
son generalmente escritos en minúscula). En la
práctica, podemos escribirlos como queramos.
Personalmente los escribo precedidos de una T (por
ejemplo Tgraph para designar un parámetro de
plantilla que representa un grafo). Esto puede
parecer inútil pero veremos que es muy práctico con
los typenames ya que vuelve el código más legible.
8. Templates comunes
STL
• La STL (Standard Template Library) viene por
defecto con los compiladores C++. Esta biblioteca
incluye un juego de contenedores genéricos,
especialmente: std::vector: vectores (tabla de
elementos de tipo T adyacentes en memoria),
acceso en O(1), std::set: conjuntos de elementos
de tipo T sin repeticiones y ordenados según el
operador <, acceso en O(log(n)), std::list: listas
encadenadas (acceso en O(n), inserción al inicio y
al final de la lista en O(1)).
9. Templates comunes
BGL
• La BGL (Boost Graph Library) proporciona clases de
grafo genéricos y los algoritmos correspondientes
(algoritmo del camino más corto, algoritmo de
float, ect).
10. Templates de función
• Hemos visto anteriormente, que las funciones
genéricas son un mecanismo C++ que permite
definir una función mediante uno o varios
parámetros (tipos genéricos). A partir de estas
plantillas el compilador es capaz de generar
código de funciones distintas que comparten
ciertas características.
11. Templates de clase generica
• Son un artificio C++ que permite definir una
clase mediante uno o varios parámetros. Este
mecanismo es capaz de generar infinitas clases
distintas pero compartiendo un diseño común.
Al igual que en plantillas de funciones, las clases
así generadas se denominan instancias o
especializaciones de la plantilla.
12. Trabajar con templates
Para trabajar con plantillas, necesitamos 3 cosas:
• La palabra clave typename: indica que el tipo que
sigue es abstracto (parámetro de plantilla o
depende de un parámetro de plantilla) y debe ser
tomado en cuenta únicamente cuando se le
instancia.
13. Trabajar con templates
• La palabra clave template: indica que la clase o
función que le sigue toma parámetros de plantilla.
Después de la palabra clave template se escriben
directamente los parámetros de plantilla (precedidos
de la palabra clave typename, struct, class, o tipo de
base según el tipo de parámetro de plantilla
esperado) entre “<< >>”, seguidos de la clase o
función.
14. Trabajar con templates
• El operador: permite acceder a los campos (en
particular los tipos) y métodos estáticos de una
clase o de una estructura. No es especifico a las
plantillas (se aplica a las clases y estructuras en
general y a los namespaces).
15. Recomendaciones
• Es aconsejable realizar el diseño y una
primera depuración con una clase normal
antes de convertirla en una clase genérica.
• Es más fácil imaginarse el funcionamiento
referido a un tipo concreto que a entes
abstractos.
• Es más fácil entender los problemas que
pueden presentarse si se maneja una clase
concreta.
• En estos casos es más sencillo ir de lo
particular a lo general.