Maison > développement back-end > C++ > Comment l'ordre partiel de C 11 détermine-t-il des modèles de fonctions plus spécialisés ?

Comment l'ordre partiel de C 11 détermine-t-il des modèles de fonctions plus spécialisés ?

Susan Sarandon
Libérer: 2024-12-05 10:37:10
original
690 Les gens l'ont consulté

How Does C  11's Partial Ordering Determine More Specialized Function Templates?

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
Copier après la connexion

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)) avec le type de fonction d'origine de #1 (#1) réussit.

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal