ProgrammationDéveloppeur C++

Qu'est-ce que les templates en C++ ? Quels types de templates existent-ils ? Quelles difficultés et erreurs surviennent lors de la conception et de l'utilisation des templates ? Montrez un exemple de template de classe et de fonction.

Réussissez les entretiens avec l'assistant IA Hintsage

Réponse.

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 :

  • Templates de fonctions : permettent de créer une fonction pour différents types.
  • Templates de classes : permettent de créer des classes fonctionnant avec différents types.
  • Templates avec paramètres de valeur : peuvent être paramétrisés non seulement par des types, mais aussi par des valeurs constantes.

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; }

Question piège.

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 }

Exemples d'erreurs réelles dues à l'ignorance des subtilités du sujet.


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.