Compartir a través de


Información general sobre plantillas

Las plantillas, que a veces se denominan tipos con parámetros, son mecanismos para generar las funciones y clases basadas en parámetros de tipo.Mediante plantillas, puede diseñar una clase única o trabajar que opera en datos de muchos tipos, en lugar de tener que crear una clase independiente para cada tipo.

Comentarios

Por ejemplo, para crear un funcione seguridad que devuelve el menor de dos parámetros sin utilizar las plantillas, escribiría un conjunto de funciones sobrecargadas como ésta:

// what_are_templates1.cpp
// compile with: /c
// min for ints
int min( int a, int b ) {
   return ( a < b ) ? a : b;
}

// min for longs
long min( long a, long b ) {
   return ( a < b ) ? a : b;
}

// min for chars
char min( char a, char b ) {
   return ( a < b ) ? a : b;
}

Mediante plantillas, puede reducir esta duplicación en una plantilla de función:

// what_are_templates2.cpp
// compile with: /c
template <class T> T min( T a, T b ) {
   return ( a < b ) ? a : b;
}

Las plantillas pueden reducir significativamente el tamaño del código fuente y aumentar flexibilidad de código sin reducir la seguridad de tipos.

hay dos tipos principales de plantillas: plantillas de función y plantillas de clase.En el ejemplo anterior, min es una plantilla de función.Una plantilla de clase es una clase con un parámetro, por ejemplo:

// what_are_templates3.cpp
template <class T> class A {
   T m_t;
   public:
      A(T t): m_t(t) {} 
      void f(T t);
};

int main() {
   A<int> a(10);
}

Las plantillas se declaran y definido similar a otras funciones y clases, con algunas diferencias principales.Una declaración de plantilla no define totalmente una función o clase; define sólo un esquema sintáctico para una clase o función.Una clase o función real es creada a partir de una plantilla para una instancia con nombre de proceso.Las clases o funciones individuales creadas se conocen como lo con instancias.Por ejemplo, una plantilla de clase:

template <class T> struct A { . . . };

puede usar para crear instancias de las clases para A<int>, A<char>, A<int*>, A<MyClass*>, etc.

La creación de clases o funciones puede realizarse implícita o explícitamente.La creación de instancias explícita es una manera de indicar en voz alta en código qué versiones de plantilla deben generarse.La creación implícita permite que las plantillas se crearon instancias necesarios en el punto donde primero se utilizan.

Las plantillas también se pueden parametrizar por un parámetro de valor, en cuyo caso el parámetro de plantilla se declara como parámetro a una función.Los tipos de punto flotante y los tipos de clase no se permiten como parámetros de valor.

// what_are_templates4.cpp
// compile with: /EHsc
#include <iostream>
using namespace std;

template <int i> class A {
   int array[i];
public:
   A() { memset(array, 0, i*sizeof(int)); }
};

int main() {
   A<10> a;
}

Un problema común con plantillas es que puede ser una solución única, lo que significa que el mismo código se aplica a todos los tipos.Si necesita personalizar el comportamiento de la plantilla para un tipo determinado, puede utilizar la especialización.Mediante la especialización explícita, una plantilla se puede especializar para un tipo real determinado, no un tipo genérico.Una plantilla de clase también puede ser especializada parcial, que es útil si tiene una plantilla con parámetros de tipo y varios solo de personalizar el comportamiento respecto a algunos de los parámetros.Una especialización parcial todavía es genérica y necesita argumentos de plantilla generar una clase creada instancias real.

Vea también

Otros recursos

Plantillas