C ++ succinctement modèles

introduction

Les fonctions de modèle et les classes ont un objectif similaire en C ++, tout comme les génériques en C #. Ils vous permettent de réutiliser votre code sans écrire une fonction ou une classe pour chaque variante de votre choix. Tant que les types que vous fournissez au modèle sont associés aux fonctionnalités que le modèle utilise, tout va bien. Sinon, le compilateur générera une erreur. En effet, le compilateur génère une classe unique pour chaque spécialisation utilisée. Étant donné que le compilateur construit des classes et des fonctions à partir des modèles de votre programme, les fonctions et les classes de modèles doivent être placées dans des fichiers d'en-tête et définies entièrement en ligne. De cette façon, le compilateur peut les analyser pour tous les fichiers de code source qui les utilisent.

En fin de compte, les modèles peuvent devenir très complexes. La bibliothèque standard C ++ illustre la puissance et la complexité des modèles avancés. Malgré cela, vous n’avez pas besoin d’une connaissance approfondie des modèles pour les utiliser efficacement. Une compréhension des bases des modèles C ++ vous aidera à débloquer une quantité importante de fonctionnalités et de puissance..


Fonctions de modèle

Une fonction de modèle est une fonction autonome qui prend au moins un argument de modèle. Le fait qu’il prenne un argument le rend incomplet jusqu’à ce qu’il soit appelé avec un argument concret, ce qui fait que le modèle devient une fonction entièrement définie. Voici une fonction template qui prend deux arguments.

Exemple: TemplatesSample \ PeekLastItem.h

#pragma une fois template U PeekLastItem (T & collection) return * collection.rbegin (); 

La création de tout modèle-fonction ou classe-commence par le mot-clé template suivi des paramètres entre crochets, comme indiqué dans l'exemple précédent avec la classe T et la classe U. L'utilisation du mot classe avant T et U ne signifie pas les arguments doivent être des classes. Pensez classe plutôt comme un mot général destiné à transmettre le sens d'un type non spécifique. Vous pouvez avoir un modèle avec des types concrets ou avec un mélange de types de classes non spécifiques et de types concrets, tels que modèle. L'utilisation de T comme nom pour le premier argument et de U pour un second est une pratique courante et non une exigence. Vous pouvez utiliser presque n'importe quoi comme nom d'argument de modèle.

La fonction précédente prend en référence un élément de type T. Elle suppose que T aura une fonction membre appelée commencer, qui peut être appelé sans argument et renverra un type de pointeur qui, lorsqu'il sera dé-référencé, deviendra un objet de type U. Cette fonction particulière est principalement conçue pour fonctionner avec de nombreuses classes de la collection de la bibliothèque standard C ++, bien que toute classe répond aux hypothèses que la fonction pose à propos du type T peut être utilisé avec cette fonction de modèle. Cette capacité à prendre n'importe quel type, à y ajouter les fonctionnalités requises et à le rendre ainsi utilisable avec un modèle constitue le principal attrait des modèles..


Classes de modèles

Les classes de modèles sont similaires aux fonctions de modèles, mais elles sont des classes plutôt que de simples fonctions autonomes. Regardons un exemple.

Exemple: TemplatesSample \ SimpleMath.h

#pragma une fois template classe SimpleMath public: SimpleMath (void)  ​​~ SimpleMath (void)  ​​T Ajouter (T a, T b) retour a + b;  T Soustrayez (T a, T b) retour a - b;  T Multiplier (T a, T b) retour a * b;  T Diviser (T a, T b) retour a / b; ;

Comme son nom l'indique, cette classe n'est pas destinée à être plus qu'une démonstration. Il n'y a qu'un seul argument de type. En examinant la définition de la classe, nous pouvons en déduire que les exigences de T dans ce cas-ci sont les opérateurs suivants, qui fonctionnent tous sur deux instances de T et retournent une instance de T:

  • +
  • -
  • *
  • /

Bien qu'ils appartiennent logiquement à des nombres, vous pouvez définir ces opérateurs pour toute classe ou type de données, puis instancier une instance de cette classe de modèle, qui est spécialisée pour votre classe personnalisée (par exemple, une classe Matrix)..

Une dernière remarque, si vous deviez définir les fonctions membres en dehors de la définition de la classe, mais toujours dans le même fichier d'en-tête, vous auriez alors besoin d'utiliser le mot clé inline dans les déclarations; les définitions ressembleraient à ceci: SimpleMath :: SimpleMath (void) .

Ceci est le dernier fichier de cet exemple, montrant une utilisation simple de chacun des modèles précédents..

Exemple: TemplatesSample \ TemplatesSample.cpp

#comprendre  #comprendre  #comprendre  #include "SimpleMath.h" #include "PeekLastItem.h" #include "… /pchar.h" en utilisant namespace std; int _pmain (int / * argc * /, _pchar * / * argv * / []) SimpleMath smf; wcout << "1.1F + 2.02F = " << smf.Add(1.1F, 2.02F) << "F." << endl; vector strs; strs.push_back (L "Bonjour"); strs.push_back (L "Monde"); wcout << L"Last word was '" << PeekLastItem,const wchar_t *> (strs) << L"'." << endl; return 0; 

Conclusion

Les fonctions de modèle vous aident à réutiliser le code, ce qui rend votre base de code plus facile à gérer et à DRY (Don't Repeat Yourself). Les expressions lambda sont le sujet du prochain article de cette série.

Cette leçon représente un chapitre de C ++ Succinctly, un eBook gratuit de l’équipe de Syncfusion..