fonctions et classes templates en C++

14 Aug 2021 14 Aug 2021 7369 vues ESSADDOUKI Mostafa 4 min de lecture
Introduction et syntaxe de base
1 Introduction au langage C++ 2 Entrée-sortie en C++ - cin et cout 3 Inférence de type avec le mot-clé auto en C++ 4 Classe std::string et les chaînes de caractères en C++ 5 Les structures conditionnelles (if et switch) en C++ (C++17 et C++20) 6 Les boucles en C++ (C++17 et C++20) 7 La gestion des fichiers en C++
Pointeurs et fonctions
8 Introduction aux pointeurs en C++ - Déclaration et interêts 9 Les références en C++ - déclaration et interêts 10 Les tableaux en C++ - Déclaration et interêts 11 Introduction aux fonctions en C++ 12 Passer des arguments à une fonction en C++ 13 Déclarer un paramètre const en C++ 14 Les fonctions Lambda en C++ 15 Fonctions utiles (Mathématiques et caractères) en C++
Programmation OO
16 Classes et objets en C++ 17 Spécificateurs d'accès en C++ 18 Constructeurs et destructeur d'une classe en C++ 19 Fonctions membres en C++ 20 Membres statiques d'une classe en C++ 21 Fonctions en ligne en C++ - inline 22 Fonctions et classes amies en C++ - friend 23 Surcharge des fonctions en C++ 24 Surcharge des opérateurs en C++ 25 Héritage en C++ 26 La gestion d'exceptions en C++ : déclaration, utilisation et personnalisation 27 fonctions et classes templates en C++ 28 Les nouveautés C++20 pour améliorer les templates en C++
Structures de données
29 Introduction aux structures de données 30 Les structures en C++ et la différence avec les structures en C 31 Les listes chaînées en C++ 32 Les piles en C++ 33 File d'attente en C++ 34 Arbre binaire de recherche : définition et mise en oeuvre en C++
La bibliothèque standard (STL)
35 Introduction à la bibliothèque de Template Standard STL 36 Les itérateurs en C++ - définition, déclaration et exemples 37 La classe array en C++ (bibliothèque STL) <array> 38 La classe vector de la bibliothèque STL <vector> 39 La classe deque en C++ ( Bibliothèque STL) 40 La classe list en C++ (bibliothèque STL) <list> 41 La classe stack (Pile) en C++ (bibliothèque STL) <stack> 42 La classe queue (File d'attente) en C++ (bibliothèque STL) <queue> 43 La file d'attente prioritaire (classe priority_queue) - Bibliothèque STL 44 Les ensembles en C++ (Classe set <set> - Bibliothèque STL) 45 Les dictionnaires en C++ : Classe map (Bibliothèque STL) 46 Introduction aux algorithmes de la bibliothèque STL (programmation compétitive) 47 Tri et méthodes associées en C++ - Bibliothèque STL 48 Recherche dichotomique et méthodes associées en C++ - Bibliothèque STL 49 Appliquer un prédicat ou une fonction aux éléments d'une séquence en C++ - Bibliothèque STL 50 Recherche dans une séquence et méthodes associées en C++ - Bibliothèque STL

Un template (patron) C++ permet de définir des fonctions et des classes génériques, indépendantes d'un type de données particulier. C'est le fondement de la programmation générique en C++.

Template

Un template est un patron paramétré par un ou plusieurs types génériques (T). Le compilateur génère automatiquement une version spécialisée pour chaque type utilisé — c'est l'instanciation du template, réalisée à la compilation.

Mots-clés

C++ utilise template pour déclarer un patron, et typename (ou class, interchangeable ici) pour nommer le paramètre de type générique.

Fonction template

Une fonction template peut fonctionner avec différents types de données. Elle remplace avantageusement la surcharge de fonctions pour des logiques identiques.

   
Syntaxe C++
template <class T>  // ou template <typename T>
type_retour nomFonction(T p1) {
    ...
}

  Exemple n°1 — Somme de deux valeurs du même type

#include <iostream>
using namespace std;

template <class T>
T somme(T v1, T v2) { return v1 + v2; }

int main() {
    cout << somme(5, 2)       << endl; // int
    cout << somme(3.5, 2.75)  << endl; // double
    return 0;
}

  Exemple n°2 — Maximum générique

template <class T>
T maxi(T n1, T n2) { return (n1 > n2) ? n1 : n2; }

int main() {
    cout << maxi(5, 2)       << endl; // int : 5
    cout << maxi(3.5, 2.75)  << endl; // double : 3.5
    cout << maxi('Z', 'M')   << endl; // char : Z
    return 0;
}

  Exemple n°3 — Deux paramètres de types différents

template <class T1, class T2>
void afficher(T1 n1, T2 n2) {
    cout << n1 << endl;
    cout << n2 << endl;
}

int main() {
    afficher(2, 'A');
    afficher(3.75, 'Z');
    afficher(7.5, 8);
    return 0;
}

Classe template

Une classe template définit une structure générique paramétrée par un ou plusieurs types. Elle est utile pour implémenter des structures de données comme LinkedList, Stack, Queue, Array, etc.

   
Syntaxe — Classe template C++
template <class T>
class nomClasse {
    public:
        T attr;
        T nomFonction(T arg);
};

// Instanciation
nomClasse<int>    obj1;
nomClasse<float>  obj2;
nomClasse<string> obj3;

  Exemple n°5 — Classe Tableau générique

#include <iostream>
using namespace std;

template <class T>
class Tableau {
private:
    T *tab;
    int taille;
public:
    Tableau(T t[], int n);
    void afficher();
};

template <class T>
Tableau<T>::Tableau(T t[], int n) {
    tab = new T[n];
    taille = n;
    for(int i = 0; i < taille; i++) tab[i] = t[i];
}

template <class T>
void Tableau<T>::afficher() {
    for (int i = 0; i < taille; i++) cout << " " << *(tab + i);
    cout << endl;
}

int main() {
    int t[5] = {1, 2, 3, 4, 5};
    Tableau<int> obj(t, 5);
    obj.afficher();
    return 0;
}

Questions fréquentes sur les templates

QuestionRéponse
Peut-on avoir des arguments de type par défaut ?Oui : template<class T, class U = char>
Que se passe-t-il avec un membre statique ?Chaque instanciation du template possède sa propre variable statique
Peut-on passer des paramètres non typés ?Oui (ex. : template<class T, int max>), mais la valeur doit être une constante connue à la compilation
Paramètres non typés

Un paramètre non typé doit être une constante — le compilateur en a besoin au moment de la compilation pour générer le code. Passer une variable ordinaire provoquera une erreur de compilation.

template <class T, int max>
int mini(T tab[], int n) {
    int m = max;
    for (int i = 0; i < n; i++) if (tab[i] < m) m = tab[i];
    return m;
}

int main() {
    int t1[] = {750, 30, 11, 18};
    cout << mini<int, 10000>(t1, 4) << endl; // OK : 10000 est une constante
    // mini<int, maxi>(t2, n2); // ERREUR : maxi est une variable
    return 0;
}

Discussion (0)

Soyez le premier à laisser un commentaire !

Laisser un commentaire

Votre commentaire sera visible après modération.