Contenu du cours
Modèles C++
Modèles C++
Spécialisation Partielle de Modèle
La spécialisation de modèle pour un modèle à un seul paramètre est simple, mais elle devient plus complexe avec plusieurs paramètres. C'est là que la spécialisation partielle de modèle entre en jeu. Elle vous permet de créer une version spécialisée d'un modèle pour des sous-ensembles spécifiques de types ou de valeurs.
main
// What if `T1` and `T2` are the same type? // Or what if you want to define special behavior when `T1` is a `std::string`? template<typename T1, typename T2> void TemplateExample(T1 first, T2 second) { std::cout << "Generic template!" << std::endl; }
Syntaxe de la spécialisation partielle de modèle
Vous pouvez considérer la spécialisation partielle de modèle comme une forme de surcharge de modèle. Voici les règles à suivre:
Dans la spécialisation partielle, vous définissez une nouvelle version d'une fonction modèle avec certains de ses paramètres fixés à des types spécifiques tout en laissant les autres génériques. Le compilateur utilise cette version spécialisée chaque fois qu'il rencontre des types correspondants lors de l'instanciation du modèle.
main
#include <iostream> // Primary template template<typename T1, typename T2> bool IsSameType(T1 first, T2 second) { return false; } // Partial specialization for when both types are the same template<typename T> bool IsSameType(T first, T second) { return true; } int main() { std::cout << IsSameType(10, 'a') << std::endl; std::cout << IsSameType("Hello", "World") << std::endl; }
C'est une façon d'utiliser la spécialisation de template, mais il existe un autre scénario plus courant.
main
#include <iostream> // Primary template template <typename T1, typename T2> // General case void Template(T1 a, T2 b) { std::cout << "General" << std::endl; } // Partial specialization for when `T1` is `bool` template <typename T2> // Special case when the first type is `bool` void Template(bool a, T2 b) { std::cout << "Special" << std::endl; } int main() { Template(false, 25); Template(100, 300); }
Merci pour vos commentaires !