Notes d'étude du langage de programmation C++ sur les modèles

1. Fonction de modèle

1.1 Concepts de base

Les modèles génèrent du code au moment de la compilation, et son exécution n'est pas un remplacement de macro, mais des règles de renommage

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

Et le N suivant est une macro substitution qui remplace une constante,
insérez la description de l'image ici

1.2 Exemple de poussée de fonction de modèle :

A travers les différents paramètres passés dans l'exemple suivant, analysons pourquoi T est déduit à la compilation ? (Des notes ont donné les résultats de la déduction)
Exemple 1 :
insérez la description de l'image ici
Exemple 2 :
insérez la description de l'image ici
Exemple 3 :
insérez la description de l'image ici
Exemple 4 :
insérez la description de l'image ici

1.3 Distinguer généralisation complète, spécialisation partielle et spécialisation complète

insérez la description de l'image ici

1.4 Remarque :

①Parce que la couche inférieure de la référence (&) est int * const (pointeur constant), une fois la référence transmise, le compilateur ne peut pas déduire le const après int* , donc la compilation échoue.
insérez la description de l'image ici
Nous devons donc ajouter manuellement const après T dans la fonction de modèle
insérez la description de l'image ici

② Les fonctions de modèle peuvent également être surchargées
insérez la description de l'image ici

2. Classe de modèle

2.1 Règles de déduction pour la compilation des classes de modèles

Ajoutez le type concret de T au nom de la classe et
renommez le type concret en T avec un typedef à l'intérieur de la classe
insérez la description de l'image ici

2.2 Il peut y avoir des non-types, et lorsque notre N est une valeur différente, le type d'objet sera également différent

Par exemple, le N suivant est respectivement 100 et 10. Après le remplacement, deux paires différentes seront instanciées (la raison est que les attributs de membre sont différents, ce sont donc des objets différents ).

insérez la description de l'image ici

2.3 Compilation des fonctions dans les modèles de classe

Si la fonction dans le modèle de classe est mobilisée, la fonction dans le modèle de classe participera à la compilation, et si elle n'est pas mobilisée, elle ne participera pas à la compilation

Ainsi, ce qui suit changera la valeur de N, si nous ne l'appelons pas, il ne détectera pas l'erreur.
insérez la description de l'image ici

2.4 Les paramètres de type de modèle peuvent se voir attribuer des valeurs par défaut

insérez la description de l'image ici

2.5 Les paramètres de type modèle peuvent avoir plusieurs

insérez la description de l'image ici

2.6 Quand est un type de modèle

Arrayiat, parce qu'un type entier a été explicitement donné, le compilateur instancie le contenu spécifique, alors c'est un type spécifique

Array Il s'agit d'un type de modèle, puisqu'aucun type explicite n'est donné, le compilateur ne peut pas porter de jugement sur le type à gérer.

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 Introduction des problèmes d'extraction de type

T est un type,

seq est un type qui peut recevoir un type de modèle, qui doit avoir un paramètre de modèle

Si lors de l'utilisation de la fonction principale, cette situation se produit :

Conteneur<int,Array>conteneur ;

Ensuite, Array, qui n'est pas un type de modèle, deviendra un type de conception spécifique, il devrait donc ressembler à ceci : Container<int,Array>contatiner ;
insérez la description de l'image ici

Comment typer l'extraction, de sorte que T puisse être clairement identifié comme étant de type int ?

Ne remplacez pas directement tous les T dans le programme par int, ou d'autres types spécifiques, c'est ennuyeux, donc l'extraction de type est nécessaire.
insérez la description de l'image ici

Je suppose que tu aimes

Origine blog.csdn.net/m0_54355780/article/details/122892330
conseillé
Classement