Notes d'étude du langage de programmation C++ sur les modèles
- 1. Fonction de modèle
- 2. Classe de modèle
-
- 2.1 Règles de déduction pour la compilation des classes de modèles
- 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
- 2.3 Compilation des fonctions dans les modèles de classe
- 2.4 Les paramètres de type de modèle peuvent se voir attribuer des valeurs par défaut
- 2.5 Les paramètres de type modèle peuvent avoir plusieurs
- 2.6 Quand est un type de modèle
- 2.7 Introduction des problèmes d'extraction de type
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,
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 :
Exemple 2 :
Exemple 3 :
Exemple 4 :
1.3 Distinguer généralisation complète, spécialisation partielle et spécialisation complète
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.
Nous devons donc ajouter manuellement const après T dans la fonction de modèle
② Les fonctions de modèle peuvent également être surchargées
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
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 ).
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.
2.4 Les paramètres de type de modèle peuvent se voir attribuer des valeurs par défaut
2.5 Les paramètres de type modèle peuvent avoir plusieurs
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 ;
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.