Modèles C ++

Dans cet article, vous découvrirez les modèles en C ++. Vous apprendrez à utiliser la puissance des modèles pour la programmation générique.

Les modèles sont des fonctionnalités puissantes de C ++ qui vous permettent d'écrire des programmes génériques. En termes simples, vous pouvez créer une seule fonction ou une classe pour travailler avec différents types de données à l'aide de modèles.

Les modèles sont souvent utilisés dans une base de code plus large à des fins de réutilisation du code et de flexibilité des programmes.

Le concept de modèles peut être utilisé de deux manières différentes:

  • Modèles de fonction
  • Modèles de cours

Modèles de fonction

Un modèle de fonction fonctionne de manière similaire à une fonction normale, avec une différence clé.

Un modèle de fonction unique peut fonctionner avec différents types de données à la fois, mais une seule fonction normale ne peut fonctionner qu'avec un seul ensemble de types de données.

Normalement, si vous devez effectuer des opérations identiques sur deux ou plusieurs types de données, vous utilisez la surcharge de fonction pour créer deux fonctions avec la déclaration de fonction requise.

Cependant, une meilleure approche consisterait à utiliser des modèles de fonctions, car vous pouvez effectuer la même tâche en écrivant moins de code maintenable.

Comment déclarer un modèle de fonction?

Un modèle de fonction commence par le modèle de mot-clé suivi du / des paramètre / s du modèle à l'intérieur duquel est suivi la déclaration de fonction.

 template < classe T> T someFunction (T arg) (…)

Dans le code ci-dessus, T est un argument de modèle qui accepte différents types de données (int, float) et class est un mot-clé.

Vous pouvez également utiliser un mot-clé typenameau lieu d'une classe dans l'exemple ci-dessus.

Lorsque, un argument d'un type de données est passé à someFunction( ), le compilateur génère une nouvelle version de someFunction()pour le type de données donné.

Exemple 1: Modèle de fonction pour trouver le plus grand nombre

Programme pour afficher le plus grand parmi deux nombres à l'aide de modèles de fonction.

 // If two characters are passed to function template, character with larger ASCII value is displayed. #include using namespace std; // template function template T Large(T n1, T n2) ( return (n1> n2) ? n1 : n2; ) int main() ( int i1, i2; float f1, f2; char c1, c2; cout <> i1>> i2; cout << Large(i1, i2) <<" is larger." << endl; cout <> f1>> f2; cout << Large(f1, f2) <<" is larger." << endl; cout <> c1>> c2; cout << Large(c1, c2) << " has larger ASCII value."; return 0; )

Production

Entrez deux nombres 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 a une valeur ASCII plus grande.

Dans le programme ci-dessus, un modèle de fonction Large()est défini qui accepte deux arguments n1 et n2 de type de données T. Tsignifie que l'argument peut être de n'importe quel type de données.

Large() La fonction renvoie le plus grand des deux arguments à l'aide d'une simple opération conditionnelle.

A l' intérieur de la main()fonction, les variables de trois différents types de données: int, floatet charsont déclarés. Les variables sont ensuite transmises au Large()modèle de fonction en tant que fonctions normales.

Pendant l'exécution, lorsqu'un entier est passé à la fonction modèle, le compilateur sait qu'il doit générer une Large()fonction pour accepter les arguments int et le fait.

De même, lorsque des données à virgule flottante et des données char sont transmises, il connaît les types de données d'argument et génère la Large()fonction en conséquence.

De cette façon, l'utilisation d'un seul modèle de fonction a remplacé trois fonctions normales identiques et rendu votre code maintenable.

Exemple 2: échange de données à l'aide de modèles de fonctions

Programme pour échanger des données à l'aide de modèles de fonctions.

 #include using namespace std; template 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 << "Before passing data to function template."; cout << "i1 = " << i1 << "i2 = " << i2; cout << "f1 = " << f1 << "f2 = " << f2; cout << "c1 = " << c1 << "c2 = " << c2; Swap(i1, i2); Swap(f1, f2); Swap(c1, c2); cout << "After passing data to function template."; cout << "i1 = " << i1 << "i2 = " << i2; cout << "f1 = " << f1 << "f2 = " << f2; cout << "c1 = " << c1 << "c2 = " << c2; return 0; ) 

Production

Avant de transmettre 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 transmis les données au modèle de fonction. i1 = 2 i2 = 1 f1 = 2,2 f2 = 1,1 c1 = b c2 = a

Dans ce programme, au lieu d'appeler une fonction en passant une valeur, un appel par référence est émis.

Le Swap()modèle de fonction prend deux arguments et les échange par référence.

Modèles de cours

Comme les modèles de fonctions, vous pouvez également créer des modèles de classe pour les opérations de classe génériques.

Parfois, vous avez besoin d'une implémentation de classe identique pour toutes les classes, seuls les types de données utilisés sont différents.

Normalement, vous devez créer une classe différente pour chaque type de données OU créer différentes variables membres et fonctions au sein d'une même classe.

This will unnecessarily bloat your code base and will be hard to maintain, as a change is one class/function should be performed on all classes/functions.

However, class templates make it easy to reuse the same code for all data types.

How to declare a class template?

 template <class T> class className (… public: T var; T someOperation(T arg);… );

In the above declaration, T is the template argument which is a placeholder for the data type used.

Inside the class body, a member variable var and a member function someOperation() are both of type T.

How to create a class template object?

To create a class template object, you need to define the data type inside a when creation.

 className classObject; 

For example:

 className classObject; className classObject; className classObject; 

Example 3: Simple calculator using Class template

Program to add, subtract, multiply and divide two numbers using class template

 #include using namespace std; template class Calculator ( private: T num1, num2; public: Calculator(T n1, T n2) ( num1 = n1; num2 = n2; ) void displayResult() ( cout << "Numbers are: " << num1 << " and " << num2 << "." << endl; cout << "Addition is: " << add() << endl; cout << "Subtraction is: " << subtract() << endl; cout << "Product is: " << multiply() << endl; cout << "Division is: " << 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 intCalc(2, 1); Calculator floatCalc(2.4, 1.2); cout << "Int results:" << endl; intCalc.displayResult(); cout << endl << "Float results:" << endl; floatCalc.displayResult(); return 0; ) 

Output

 Int results: Numbers are: 2 and 1. Addition is: 3 Subtraction is: 1 Product is: 2 Division is: 2 Float results: Numbers are: 2.4 and 1.2. Addition is: 3.6 Subtraction is: 1.2 Product is: 2.88 Division is: 2 

In the above program, a class template Calculator is declared.

The class contains two private members of type T: num1 & num2, and a constructor to initalize the members.

It also contains public member functions to calculate the addition, subtraction, multiplication and division of the numbers which return the value of data type defined by the user. Likewise, a function displayResult() to display the final output to the screen.

In the main() function, two different Calculator objects intCalc and floatCalc are created for data types: int and float respectively. The values are initialized using the constructor.

Notice we use and while creating the objects. These tell the compiler the data type used for the class creation.

This creates a class definition each for int and float, which are then used accordingly.

Ensuite, displayResult()des deux objets est appelé, ce qui effectue les opérations de la calculatrice et affiche la sortie.

Articles intéressants...