Les templates en C++ et la programmation générique en C
Dans cette leçon, vous allez écrire une fonction valable pour plusieurs types de données avec les templates du C++, puis la comparer à _Generic du C11.
Introduction
Les templates permettent d'écrire un modèle de code générique à partir duquel le compilateur génère la version adaptée à chaque type de données, tout en garantissant la sûreté des types. En C, on utilise généralement des macros, des pointeurs void ou le mot-clé _Generic du C11 pour obtenir un résultat comparable.
Points importants
- Comprenez comment on fait en C avant d'apprendre les abstractions du C++.
- Exprimez la possession des ressources avec RAII et la sémantique de valeur (value semantics).
- Préférez les outils sûrs du point de vue des types du C++ aux macros et aux conversions de type.
Exemples de code C et C++
#include <stdio.h>
int max_int(int left, int right) {
return left > right ? left : right;
}
double max_double(double left, double right) {
return left > right ? left : right;
}
#define MAX(left, right) _Generic((left), \
int: max_int, double: max_double)((left), (right))
int main(void) {
printf("%d %.1f\n", MAX(3, 9), MAX(2.5, 7.0));
}
9 7.0
#include <iostream>
template<class T>
T maximum(const T& left, const T& right) {
return left > right ? left : right;
}
int main() {
std::cout << maximum(3, 9) << ' '
<< maximum(2.5, 7.0) << '\n';
}
9 7
Comparaison entre C et C++
En C, la macro MAX utilise _Generic pour choisir max_int ou max_double selon le type de l'argument, mais il faut énumérer à l'avance chaque type pris en charge. En C++, le template maximum fonctionne avec tout type qui accepte la comparaison >, sans réécrire la fonction pour chaque type.
C utilise des conventions de nommage, des callbacks, des macros et des struct de contexte.
C++ offre des abstractions à la portée bien délimitée, sûres pour les types et généralement sans coût supplémentaire à l'exécution.
Exercices d'approfondissement
Exécutez les deux versions, puis modifiez le code pour observer la différence de sécurité qu'apporte chaque langage.
- Écrivez d'abord le mécanisme en C, puis utilisez la fonctionnalité équivalente du C++.
- Remplacez la libération manuelle des ressources par RAII.
- Vérifiez si la fonctionnalité provoque des allocations mémoire ou des appels de fonctions virtuelles.
S'entraîner avec un défi
Utilisez le contenu de cette leçon pour résoudre un vrai problème. Chaque défi s'exécute dans le navigateur, avec des tests instantanés et une revue par l'IA.
- Maximum d'un tableau Trouvez la plus grande valeur dans une liste. Facile
- Pile avec minimum Construisez une pile qui indique instantanément son plus petit élément après chaque push ou pop. Moyen