Définition de templates en C++

En C++, la programmation générique (ou généricité) se met en oeuvre via la syntaxe des templates. La programmation générique permet de définir des modèles de fonctions ou des modèles de classes sans que les types de données manipulés par ces modèle soit encore connus. C'est lors de l'utilisation de ces modèles que les types de données seront fixés : on parle avec de spécialisation, dans le sens ou lors va utiliser ces modèles pour des types de données bien précis.

Comme nous venons de le dire, plusieurs éléments peuvent être définis de manière générique. Nous pouvons définir des fonctions génériques : par exemple l'algorithme d'un calcul de minimum peut être codé une fois, quelque soit les types de données sur lesquels ont souhaite appliquer cette fonction (double, int, long, ...). On peut aussi définir des classes génériques : par exemple on peut coder un modèle générique de classe pour une liste chaînée sans forcément fixer le type de données des éléments stockés dans cette collection. Dans ce dernier cas, cela suppose donc que l'on puisse aussi définir des méthodes génériques.

A titre d'information, sachez qu'il ne serait pas forcément un bonne idée de recoder une classe génériques pour définir une structure de données telle qu'une liste chaînée ou un tableau dynamique. Effectivement, il existe une librairie qu'il réalise déjà tout cela et plus encore : cette librairie se nomme STL (Standard Template Library). En fait cette librairie a été standardisée depuis C++98. La STL fait donc partie de la librairie standard C++, livrée par défaut avec tous les principaux compilateurs modernes.

Dernier points : sachez qu'un modèle de code ne produit pas directement de code machine. Ce n'est qu'à l'utilisation de cet élément que les types utilisés pourront être spécialisés et que la fonction (ou la classe) associée pourra être produite. Il en découle une règle de syntaxe un peu particulière : tous les éléments génériques proposés par une librairie template réutilisable devront impérativement être définir dans un fichier d'entête (.h ou .hpp) et non dans un fichier de code (.cpp).

Etudions maintenant quelques cas particuliers de templates :