Notas de estudio del lenguaje de programación C++ sobre plantillas

1. Función de plantilla

1.1 Conceptos básicos

Las plantillas generan código en tiempo de compilación, y su ejecución no es un reemplazo de macros, sino reglas de cambio de nombre

//传参后,模板函数编译时候如下,而不是将Type替换为int
typedef int Type;
void Swap<int>(Type& a,Type& b)
{
    
    
Type tmp=a;
a=b;
b=tmp;
}

Y la siguiente N es una sustitución macro que reemplaza una constante,
inserte la descripción de la imagen aquí

1.2 Ejemplo de inserción de función de plantilla:

A través de los diferentes parámetros pasados ​​en el siguiente ejemplo, analicemos por qué se deduce T en tiempo de compilación. (Las notas han dado los resultados de la deducción)
Ejemplo 1:
inserte la descripción de la imagen aquí
Ejemplo 2:
inserte la descripción de la imagen aquí
Ejemplo 3:
inserte la descripción de la imagen aquí
Ejemplo 4:
inserte la descripción de la imagen aquí

1.3 Distinguir entre generalización completa, especialización parcial y especialización completa

inserte la descripción de la imagen aquí

1.4 Nota:

①Debido a que la capa inferior de la referencia (&) es int * const (puntero constante), después de pasar la referencia, el compilador no puede deducir la const después de int* , por lo que la compilación falla.
inserte la descripción de la imagen aquí
Entonces, debemos agregar manualmente const después de T en la función de plantilla
inserte la descripción de la imagen aquí

② Las funciones de plantilla también se pueden sobrecargar
inserte la descripción de la imagen aquí

2. Clase de plantilla

2.1 Reglas de deducción para la compilación de clases de plantillas

Agregue el tipo concreto de T al nombre de la clase y
cambie el nombre del tipo concreto a T con un typedef dentro de la clase
inserte la descripción de la imagen aquí

2.2 Puede haber no-tipos, y cuando nuestro N es un valor diferente, el tipo de objeto también será diferente

Por ejemplo, los siguientes N son respectivamente 100 y 10. Después del reemplazo, se instanciarán dos pares diferentes (la razón es que los atributos de los miembros son diferentes, por lo que son objetos diferentes ).

inserte la descripción de la imagen aquí

2.3 Compilación de funciones en plantillas de clase

Si se moviliza la función en la plantilla de clase, la función en la plantilla de clase participará en la compilación, y si no se moviliza, no participará en la compilación

Por lo que lo siguiente cambiará el valor de N, si no lo llamamos no detectará el error.
inserte la descripción de la imagen aquí

2.4 A los parámetros de tipo de plantilla se les pueden asignar valores predeterminados

inserte la descripción de la imagen aquí

2.5 Los parámetros de tipo de plantilla pueden tener múltiples

inserte la descripción de la imagen aquí

2.6 Cuándo es un tipo de plantilla

Arrayiat, debido a que se ha proporcionado explícitamente un tipo entero, el compilador instanciará el contenido específico, entonces este es un tipo específico

Matriz Este es un tipo de plantilla, dado que no se proporciona un tipo explícito, el compilador no puede juzgar qué tipo manejar.

template<class T>
class Array
{
    
    
   enum{
    
    INIT=10};
   T* data;
   size_t capacity;
   size_t count;
};
int main()
{
    
    
    Array<int>iar;//这不是一个模板类型,因为编译器会把它实例化为下面的代码:
    /*
    class Array<int>
    {
       typedef int T;
       enum{INIT=10};
       T* data;
       size_t capacity;
       size_t count;
    };
    */
    Array//这是一个模板类型
}

2.7 Introducción de problemas de extracción de tipos

T es un tipo,

seq es un tipo que puede recibir un tipo de plantilla, que debe tener un parámetro de plantilla

Si en el uso de la función principal, se presenta esta situación:

Contenedor<int,Array>contenedor;

Entonces esto hará que Array, que no es un tipo de plantilla, se convierta en un tipo de diseño específico, por lo que debería quedar así: Container<int,Array>container;
inserte la descripción de la imagen aquí

¿Cómo escribir la extracción, de modo que T pueda identificarse claramente como tipo int?

No reemplace directamente todas las T en el programa con int u otros tipos específicos, esto es aburrido, por lo que se requiere la extracción de tipos.
inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/m0_54355780/article/details/122892330
Recomendado
Clasificación