Templates — un mécanisme de C++ permettant de créer des classes et des fonctions génériques, fonctionnant avec différents types de données sans duplication de code. C'est la base de la mise en œuvre des conteneurs STL, des algorithmes et de nombreux modèles de programmation générique.
Types de templates :
Exemple de template de classe :
template<typename T> class Box { public: Box(T value): data(value) {} T get() const { return data; } private: T data; };
Exemple de template de fonction :
template<class T> T add(const T& a, const T& b) { return a + b; }
Peut-on spécialiser explicitement uniquement une méthode d'une classe template, sans spécialiser toute la classe ? Si oui, comment cela se fait-il ?
Réponse :
Oui, c'est possible. Il n'est pas nécessaire de spécialiser toute la classe ; il suffit de spécialiser une méthode :
template <typename T> class Foo { public: void bar(); }; template <> void Foo<int>::bar() { // Spécialisation uniquement de la méthode bar pour int // Implémentation }
Histoire
Un template de fonction pour la comparaison a été écrit dans le projet :template <typename T> bool cmp(const T& a, const T& b) { return a < b; }Lors de son utilisation avec des types n'ayant pas l'opérateur
<, une erreur de compilation est survenue, qui a été longtemps recherchée, car le diagnostic était donné uniquement lors de l'instanciation du template, et non au moment de sa définition.
Histoire
Le développeur a tenté d'utiliser l'addition dans une fonction template pour une classe utilisateur, ayant oublié de surcharger l'opérateur+. Cela a conduit à des erreurs de compilation lors du premier appel avec cette classe.
Histoire
Lors de la création d'un conteneur basé sur un template de classe, une méthode a été faite qui ne dépendait pas du type template, mais a été placée en dehors de la classe sans spécialisation explicite :template<> int MyContainer<int>::size() const { ... }Cela a conduit à une erreur de liaison, car la spécialisation a été déclarée, mais n'a pas été correctement mise en œuvre pour tous les types.