Skip to content

El beneficio de las plantillas

Andres Angarita edited this page Dec 28, 2019 · 1 revision

Las plantillas son un buen candidato para hacer frente a los comportamientos combinatorios porque generan código en tiempo de compilación en función de los tipos proporcionados por el usuario.

Las plantillas de clase se pueden personalizar de formas que no son compatibles con las clases regulares. Si desea implementar un caso especial, puede especializar cualquier función miembro de una plantilla de clase para una instanciación específica de la plantilla de clase. Por ejemplo, si la plantilla es SmartPtr<T>, puede especializar cualquier función miembro para, por ejemplo, SmartPtr<Widget>. Esto le brinda una buena granularidad en el comportamiento de personalización.

Además, para las plantillas de clase con múltiples parámetros, puede usar la especialización de plantilla parcial. La especialización de plantilla parcial le brinda la capacidad de especializar una plantilla de clase solo para algunos de sus argumentos. Por ejemplo, dada la definición:

template <class T, class U> class SmartPtr { ... };

puede especializarse SmartPtr<T, U> para Widget y cualquier otro tipo utilizando la siguiente sintaxis:

template <class U> class SmartPtr<Widget, U> { ... };

El tiempo de compilación innato y la naturaleza combinatoria de las plantillas las hacen muy atractivas para crear piezas de diseño. Tan pronto como intente implementar tales diseños, se toporá con varios problemas que no son evidentes:

  1. No puedes especializar la estructura. Usando plantillas solo, no puede especializar la estructura de una clase (sus miembros de datos). Solo puedes especializar funciones

  2. La especialización de las funciones miembros no se escala. Puede especializar cualquier función miembro de una plantilla de clase con un parámetro de plantilla, pero no puede especializar funciones miembro individuales para plantillas con múltiples parámetros de plantilla.

  3. El escritor de la biblioteca no puede proporcionar múltiples valores predeterminados. En el mejor de los casos, un implementador de plantilla de clase puede proporcionar una implementación predeterminada única para cada función miembro. No puede proporcionar varios valores predeterminado para una función miembro de plantilla.

Ahora compare la lista de inconvenientes de herencia múltiple con la lista de inconvenientes de plantilla. Curiosamente, la herencia múltiple y las plantillas fomentan compensaciones complementarias. La herencia múltiple pierde información de tipo, que abunda en plantillas. La especialización de plantillas no escala, pero la herencia múltiple escala bastante bien. Puede proporcionar solo un valor predeterminado para la función miembro de plantilla, pero puede escribir un número ilimitado de clases base.

Este análisis sugiere que una combinación de plantillas y herencia múltiple podría generar un dispositivo muy flexible, apropiado para crear bibliotecas de elementos de diseño.