Ordre partiel dans la déduction du modèle de fonction
Problème :
La norme C 11 décrit un procédure de commande partielle pour comparer la spécialisation des modèles de fonctions, mais sa signification n'est pas tout à fait claire. Pouvez-vous fournir une explication avec des exemples ?
Réponse :
Pour déterminer si un modèle de fonction est plus spécialisé qu'un autre, la norme utilise une procédure de commande partielle. Cette procédure consiste à créer des types de fonctions transformées pour chaque modèle et à les comparer pour déterminer quel modèle est le plus spécialisé.
Étape 1 : Créer des types de fonctions transformées
Pour chaque modèle, un type de fonction transformé est créé en remplaçant les paramètres de type par des types spécifiques (appelés types synthétisés). Ces types synthétisés sont uniques et ne sont utilisés nulle part ailleurs dans le code.
Étape 2 : faire correspondre les types transformés aux modèles d'origine
Le type de fonction transformé du premier modèle correspond par rapport au type de fonction d'origine du deuxième modèle. Le processus est ensuite répété dans la direction opposée.
Étape 3 : Déterminer la spécialisation
Si une transformation produit une correspondance et l'autre non, le modèle avec la correspondance la transformation est considérée comme plus spécialisée. Si aucune correspondance n'est trouvée dans l'un ou l'autre sens, aucun des modèles n'est considéré comme plus spécialisé que l'autre.
Exemple :
Considérons deux modèles de fonctions :
template<typename T, typename U> void foo(T, U); // #1 template<typename T> void foo(T const*, X<T>); // #2
La correspondance du type de fonction transformé de #1b (void foo(int, bool)) avec le type de fonction d'origine de #2 (#2) échoue. Cependant, la correspondance du type de fonction transformé de #2b (void foo(char const*, X
Par conséquent, le modèle de fonction n°2 est plus spécialisé que le modèle de fonction n°1.
Remarque supplémentaire :
Cette procédure de commande partielle est également utilisé pour comparer la spécialisation des spécialisations de modèles de classes partielles. Dans ce cas, la procédure consiste d'abord à créer des modèles de fonctions fictifs pour chaque spécialisation puis à comparer ces modèles de fonctions en utilisant les mêmes règles.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!