English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Dans cet article, vous allez apprendre C ++Vous allez apprendre à utiliser les fonctionnalités des templates pour le développement de programmes génériques.
Les templates sont dans C ++Les fonctionnalités puissantes vous permettent d'écrire des programmes génériques. En bref, vous pouvez utiliser les templates pour créer une fonction ou une classe pour traiter différents types de données.
Les templates sont généralement utilisés dans des bibliothèques de code plus grandes, dans le but de réaliser la réutilisation du code et la flexibilité des programmes.
Le concept de template peut être utilisé de deux manières différentes :
Template de fonction
Modèle de classe
Le fonctionnement des templates de fonction est similaire à celui des fonctionsFonctionEn même temps, il y a une différence.
Un template de fonction unique peut traiter différents types de données en une seule fois, mais une fonction ordinaire unique ne peut traiter qu'un ensemble de types de données.
Généralement, si vous devez exécuter la même opération sur deux ou plusieurs types de données, vous pouvez utiliser des surcharges de fonction pour créer deux fonctions avec les déclarations de fonction nécessaires.
Cependant, la meilleure méthode est d'utiliser des templates de fonction, car vous pouvez exécuter la même tâche avec moins de code.
Les templates de fonction commencent par le mot-clé template, suivi de la déclaration des paramètres de template entre crochets <> et enfin la déclaration de la fonction.
template <class T> T someFunction(T arg) { ... .. ... }
Dans le code ci-dessus, T est un paramètre de template qui accepte différents types de données (comme int, float, etc.), tandis queclassest un mot-clé.
Dans l'exemple ci-dessus, vous pouvez également utiliser le mot-clé typename à la place de class.
Lorsque des paramètres de type de données sont passés à someFunction(), le compilateur génère une nouvelle version de someFunction() pour le type de données donné.
Le programme utilise le template de fonction pour afficher le plus grand des deux nombres.
//Si deux caractères sont passés au template de fonction, le caractère avec une valeur ASCII plus grande est affiché. #include <iostream> using namespace std; // template function template <class T> T Large(T n1, T n2) { return (n1 > n2) ? n1 : n2; } int main() { int i1, i2; float f1, f2; char c1, c2; cout << "\nEntrez deux entiers:\n"; cin >> i1 >> i2; cout << Large(i1, i2) << " est plus grand." << endl; cout << "\nEntrez deux nombres à virgule flottante:\n"; cin >> f1 >> f2; cout << Large(f1, f2) << " est plus grand." << endl; cout << "\nEntrez deux caractères:\n"; cin >> c1 >> c2; cout << Large(c1, c2) << " a une valeur ASCII plus grande."; return 0; }
Résultat de la sortie
Entrez deux entiers: 5 10 10 est plus grand. Entrez deux nombres à virgule flottante: 12.4 10.2 12.4 est plus grand. Entrez deux caractères: z Z z possède une valeur ASCII plus grande.
Dans le programme ci-dessus, une fonction template Large() a été définie, qui accepte deux paramètres de type de données T n1et n2。T représente que ce paramètre peut être de n'importe quel type.
La fonction Large() utilise une simpleOpération conditionnelleRetourne le plus grand des deux paramètres.
À l'intérieur de la fonction main(), trois variables de types de données différents ont été déclarées : int, float et char. Ensuite, les variables ont été passées à la fonction template Large() en tant que fonction conventionnelle.
Au moment de l'exécution, lorsque des entiers sont passés à la fonction template, le compilateur sait qu'il doit générer une fonction Large() pour accepter les paramètres int et le fait ainsi.
De même, lorsque des données de type flottant et des données de type char sont transmises, il connaît le type de données en variable et génère la fonction Large() en conséquence.
De cette manière, en utilisant un seul template de fonction, vous pouvez remplacer trois fonctions conventionnelles identiques, ce qui rend votre code plus court et plus facile à maintenir.
Le programme utilise les templates de fonctions pour échanger des données.
#include <iostream> using namespace std; template <typename T> void Swap(T &n1, T &n2) { T temp; temp = n1; n1 = n2; n2 = temp; } int main() { int i1 = 1, i2 = 2; float f1 = 1.1, f2 = 2.2; char c1 = 'a', c2 = 'b'; cout << "Avant de passer des données au modèle de fonction.\n"; cout << "i1 = " << i1 << "\ni2 = " << i2; cout << "\nf1 = " << f1 << "\nf2 = " << f2; cout << "\nc1 = " << c1 << "\nc2 = " << c2; Swap(i1, i2); Swap(f1, f2); Swap(c1, c2); cout << "\n\nAprès avoir passé des données au modèle de fonction.\n"; cout << "i1 = " << i1 << "\ni2 = " << i2; cout << "\nf1 = " << f1 << "\nf2 = " << f2; cout << "\nc1 = " << c1 << "\nc2 = " << c2; return 0; }
Résultat de la sortie
Avant de passer des données au modèle de fonction. i1 = 1 i2 = 2 f1 = 1.1 f2 = 2.2 c1 = a c2 = b Après avoir passé des données au modèle de fonction. i1 = 2 i2 = 1 f1 = 2.2 f2 = 1.1 c1 = b c2 = a
Dans ce programme, les fonctions ne sont pas appelées en passant des valeurs, maisPar référenceAppeler.
La fonction modèle Swap() accepte deux paramètres et les échange par référence.
Comme pour les modèles de fonctions, vous pouvez également créer des modèles de classes pour des opérations communes.
Parfois, vous avez besoin d'une implémentation de classe pour toutes les classes, mais avec des types de données différents.
Généralement, vous devez créer une classe différente pour chaque type de données, ou créer différents variables membres et fonctions dans une classe.
Cela ajoutera beaucoup de code très similaire, ce qui rendra difficile sa maintenance.
Mais le modèle de classe rend plus facile de réutiliser le même code pour tous les types de données.
template <class T> class className { ... .. ... public: T var; T someOperation(T arg); ... .. ... };
Dans la déclaration ci-dessus, T est un paramètre de modèle, qui est un mot substitut pour le type de données utilisé.
À l'intérieur de la classe, les variables membres var et la fonction membre someOperation() sont de type T.
Pour créer un objet modèle de classe, il faut définir le type de données dans les < > lors de la création.
className<dataType> classObject;
Par exemple :
className<int> classObject; className<float> classObject; className<string> classObject;
Le programme utilise un modèle de classe pour effectuer des opérations d'addition, de soustraction, de multiplication et de division entre deux nombres
#include <iostream> using namespace std; template <class T> class Calculator { private: T num1, num2; public: Calculator(T n)1, T n2) { num1 = n1; num2 = n2; } void displayResult() { cout << "Les nombres sont : " << num1 << " et " << num2 << "." << endl; cout << "L'addition est : " << add() << endl; cout << "La soustraction est : " << subtract() << endl; cout << "Le produit est : " << multiply() << endl; cout << "La division est : " << divide() << endl; } T add() { return num1 + num2; } T subtract() { return num1 - num2; } T multiply() { return num1 * num2; } T divide() { return num1 / num2; } }; int main() { Calculator<int> intCalc(2, 1); Calculator<float> floatCalc(2.4, 1.2); cout << "Résultats en int:" << endl; intCalc.displayResult(); cout << endl << "Résultats en float:" << endl; floatCalc.displayResult(); return 0; }
Résultat de la sortie
Résultats en int : Les nombres sont : 2 et 1. L'addition est : 3 La soustraction est : 1 Le produit est : 2 La division est : 2 Résultats en float : Les nombres sont : 2.4 et 1.2. L'addition est : 3.6 La soustraction est : 1.2 Le produit est : 2.88 La division est : 2
Dans le programme ci-dessus, une classe modèle Calculator a été déclarée.
La classe contient deux membres privés de type T : num1et num2et les constructeurs pour initialiser les membres.
Il contient également des fonctions membres publiques pour calculer l'addition, la soustraction, la multiplication et la division des nombres, et retourner la valeur du type de données défini par l'utilisateur. De même, la fonction displayResult() affiche le résultat final sur l'écran.
Dans la fonction main(), deux objets Calculator de types différents ont été créés pour les types de données int et float : int et float. Utilisez le constructeur pour initialiser les valeurs.
Attention, nous utilisons <int> et <float> lors de la création d'objets. Cela indique au compilateur le type de données à utiliser pour la création de la classe.
Cela créera une définition de classe pour int et float, puis les utilisera en conséquence.
Ensuite, displayResult() est appelé pour deux objets.
Ensuite, appeler ces deux objets displayResult(), qui effectuent les opérations de calculatrice et affichent la sortie.