[c++] plantilla avanzada


prefacio

Un parámetro de plantilla clasifica los parámetros de tipo en parámetros que no son de tipo. Un parámetro de tipo es un nombre de tipo de parámetro que aparece en una lista de parámetros de plantilla, seguido de una clase o nombre de tipo. Un parámetro que no es de tipo es usar una constante como parámetro de una plantilla de clase (función), que se puede usar como una constante en una plantilla de clase (función).

1. Parámetros de la plantilla

Una referencia a un parámetro de plantilla que no es de tipo, que resuelve parte de nuestro problema,

  1. Los números de punto flotante, los objetos de clase y las cadenas no se permiten como parámetros de plantilla que no son de tipo.
  2. Los parámetros de plantilla que no son de tipo deben tener un resultado de confirmación en tiempo de compilación.
namespace ljh
{
    
    
 // 定义一个模板类型的静态数组
	 template<class T =int, size_t N = 10>
	 class array
	 {
    
    
	 private:
	 T _array[N];
	 size_t _size;
	 }
 }
 int main()
 {
    
    
 	ljh::array<int,100> s1;
 	ljh::array<int,70> s2;
 }

Similar a la situación anterior, cuando nuestras dos pilas necesitan abrir espacios diferentes, si no hay un parámetro de plantilla, necesitamos escribir dos clases.
Si es una clase predeterminada completa, también debemos llamar a ljh::array<> s1;



Especialización de plantilla

¿Cuándo necesitas usarlo?
Cuando implementamos una función Is_empty para determinar si dos valores son iguales. Sin embargo, dado que los diferentes tipos se pueden comparar de diferentes maneras, podemos usar la especialización en este momento o usar el principio de coincidencia de las plantillas.

template<class T>
bool Is_empty(T left,T right)
{
    
    
	cout << "hah" << endl;
	return left == right;
}
template<>//特化
bool Is_empty<char*>(char* left,char* right)
{
    
    
	return strcmp(left,right) == 0;
}
//模板的匹配原则
bool Is_empty(char* left,char* right)
{
    
    
	return strcmp(left,right) == 0;
}

int main()
{
    
    
	int left = 0;
	int right = 0;
	//cout << Is_empty(left, right)<<endl;
	char str1[] = "woaini";
	char str2[] = "woaini";
	cout<<typeid(str1).name()<<endl;
	cout << Is_empty(str1, str2) << endl;

	
	return 0;
}

Tenga en cuenta que str1 y str2 aquí son esencialmente nombres de matriz. Al pasar parámetros, hay conversión de tipos. Por lo tanto, si cambiamos la función de plantilla a la siguiente const T& en el proceso de paso de parámetros anterior, habrá problemas con la versión especializada. .

template<class T>
bool Is_empty(const T& left,const T& right)//error!
{
    
    
	cout << "hah" << endl;
	return left == right;
}
template<>
bool Is_empty<char*>(char* left,char* right)
{
    
    
	return strcmp(left,right) == 0;
}


Segundo, compilación separada

1. Importar la biblioteca

Solución 1: especifique explícitamente la creación de instancias.
inserte la descripción de la imagen aquí
inserte la descripción de la imagen aquí

Solución 2: no separe la compilación. Las declaraciones y definiciones están en un archivo .h. Porque de esta manera, la dirección de su función ha sido confirmada al compilar.


Resumir

¡La plantilla avanzada está aquí! !

Supongo que te gusta

Origin blog.csdn.net/weixin_52344401/article/details/121651105
Recomendado
Clasificación