Especificaciones de plantilla
La declaración de template especifica un conjunto de clases o funciones con parámetros.
template < template-parameter-list > declaration
Comentarios
La plantilla-parámetro-lista es una lista separada por comas de parámetros de plantilla, que pueden ser tipos (enel identificadorde clasede formulario,el identificadorde typename, oel identificadorde clase de > de la plantilla-parámetro-listade plantilla < ) o parámetros de sin que se utilizarán en el cuerpo de la plantilla.La sintaxis para un parámetro de plantilla es:
parameter-declaration
class identifier [ = typename ]
typename identifier [ = typename ]
template < template-parameter-list > class [identifier][= name]
Puede crear instancias de una clase que la plantilla como crearía instancias una clase normal, pero debe incluir los argumentos de plantilla dentro de los corchetes angulares (<>).Estos argumentos de plantilla pueden ser cualquier tipo si la lista de argumentos de plantilla contiene la clase o la palabra clave de typename , o un valor de tipo adecuado si el argumento es un argumento sin.No se requiere ninguna sintaxis especial llamar a una plantilla de función, aunque los corchetes angulares y los argumentos de plantilla pueden ser necesarios si los parámetros de plantilla no se puede deducir de los argumentos de la función.
La plantilla-parámetro-lista es una lista de parámetros que utiliza la función de plantilla que especifica que las partes del código siguiente varían.Por ejemplo:
template< class T, int i > class MyStack...
en este caso, la plantilla puede recibir un tipo (class T) y un parámetro constante (int i).La plantilla utilizará el tipo T y i entero constante durante la creación de instancias.En el cuerpo de la declaración de MyStack , debe hacer referencia al identificador de T .
Una declaración propio de plantilla no genera código; especifica una familia de clases o funciones, uno o varios cuyo se generará cuando se hace referencia mediante otro código.
Las declaraciones de plantilla tienen global, espacio de nombres, o ámbito de clase.No pueden declararse dentro de una función.
El ejemplo siguiente se muestra la declaración, la definición, y la creación de una plantilla de clase con un parámetro de tipo T y un parámetroide plantilla sin tipo definido.
// template_specifications1.cpp
template <class T, int i> class TestClass
{
public:
char buffer[i];
T testFunc(T* p1 );
};
template <class T, int i>
T TestClass<T,i>::testFunc(T* p1)
{
return *(p1++)
};
// To create an instance of TestClass
TestClass<char, 5> ClassInst;
int main()
{
}
argumentos de plantilla sin tipo definido
los parámetros de plantilla sin tipo definido deben estar entero, de enumeración, de puntero, de referencia, o de puntero al tipo de miembro, y deben ser constantes en tiempo de compilación.Pueden calificar como const o tipos volátiles.Los valores de punto flotante no se permiten como parámetros de plantilla.Los objetos de tipo de clase, struct o unión no se permiten como parámetros de plantilla sin tipo definido, aunque los punteros a estos objetos se permiten.Las matrices que se pasan como parámetros de plantilla sin tipo definido se convierten en punteros.Las funciones que se pasan como parámetros de sin se tratan como punteros a función.Los literales de cadena no se permiten como parámetros de plantilla.
Mediante typename en una declaración de plantilla
La palabra clave de typename se puede utilizar en la lista de parámetros de plantilla.Las siguientes declaraciones de plantilla son idénticas:
template< class T1, class T2 > class X...
template< typename T1, typename T2 > class X...
Argumentos predeterminados para los parámetros de plantilla
Las plantillas de clase pueden tener argumentos predeterminados especificados mediante el signo de = seguido por el tipo predeterminado o el valor.Plantillas de función no pueden tener argumentos predeterminados.Para obtener más información, vea Argumentos predeterminados para las plantillas de clase .:
template<typename Type> class allocator {};
template<typename Type,
typename Allocator = allocator<Type> > class stack
{
};
stack<int> MyStack;
Reutilización de los parámetros de plantilla
Los parámetros de plantilla se pueden reutilizar en la lista de parámetros de plantilla.Por ejemplo, se permite al código siguiente:
// template_specifications2.cpp
class Y
{
};
template<class T, T* pT> class X1
{
};
template<class T1, class T2 = T1> class X2
{
};
Y aY;
X1<Y, &aY> x1;
X2<int> x2;
int main()
{
}
Plantillas como parámetros de plantilla
Los parámetros de plantilla pueden son plantillas.Esta construcción significa que el argumento debe estar una plantilla, no una clase construida de la plantilla.En el ejemplo siguiente, el nombre A de parámetros de plantilla para un parámetro de plantilla de plantilla puede omitir, porque no hay ninguna manera que se puede usar.
// template_specifications3.cpp
#include <stdio.h>
template <class T> struct str1
{
T t;
};
template <template<class A> class T> struct str2
{
T<int> t;
};
int main()
{
str2<str1> mystr2;
mystr2.t.t = 5;
printf_s("%d\n", mystr2.t.t);
}
Output
5
Referencias como parámetros de plantilla
Visual Studio .NET 2003 introdujo la capacidad de utilizar referencias como parámetros de plantilla sin tipo definido.Esto no se permite en versiones anteriores.
// references__supported_as_nontype_template_parameters.cpp
#include <stdio.h>
extern "C" int printf_s(const char*,...);
template <int & ri> struct S
{
S()
{
printf_s("ri is %d\n", ri);
}
~S()
{
printf_s("ri is %d\n", ri);
}
};
int i = 1;
int main()
{
S<i> s;
i = 0;
}
Output
ri is 1
ri is 0
Instancias anidadas de plantilla
Las versiones anteriores de Visual Studio 2005 requieren que el espacio en blanco está incrustado entre listas de parámetros de plantilla cuando las instancias anidadas de plantilla se ha declarado.La sintaxis siguiente se permite:
// template_specifications4.cpp
template <typename T>
class A
{
};
template <int n>
class B
{
};
int main()
{
A<B<22>>();
}