Implémentation du trait Is_Base_Of
Le trait is_base_of fournit un moyen de déterminer si une classe est dérivée d'une autre, même en présence de données privées ou héritage protégé. Sa mise en œuvre repose sur une utilisation intelligente de modèles de fonctions et de séquences de conversion définies par l'utilisateur.
Comment ça marche
Le modèle is_base_of prend deux paramètres de modèle, B et D, représentant respectivement la base potentielle et les classes dérivées. Il définit deux fonctions membres statiques :
La valeur membre statique de is_base_of est ensuite initialisée à l'aide d'une comparaison sizeof, qui vérifie essentiellement si la taille du résultat de l'appel de check avec un Host l'objet est égal à la taille d'un résultat « oui » (c'est-à-dire une taille de tableau de 1).
Héritage de base privée
L'implémentation est capable de gérer des héritage de base car la classe Host fournit un opérateur sans opération B*() const qui renvoie nullptr. Cela permet au compilateur de remplacer B* par un D* dans la fonction check(B*, int), même si B est une base privée de D.
Importance de l'opérateur Const
L'opérateur B*() déclaré const est crucial car il garantit que le compilateur sélectionne une fonction de conversion candidate qui prend l'argument d'objet implicite this comme référence non const. Cette différence subtile permet au trait is_base_of de différencier l'héritage public et privé en vérifiant si la conversion vers le type de base est autorisée.
Fonction de vérification du modèle
La décision de utiliser une fonction de modèle check(D*, T) au lieu d'une fonction sans modèle check(B*, int) s'appuie sur des règles de résolution de surcharge. Lors de la recherche de fonctions de conversion, si deux fonctions sont également viables, le type de retour de la fonction décide laquelle est la meilleure. En utilisant un modèle avec un type de retour oui, cela permet au compilateur de sélectionner la version correcte du contrôle en fonction de l'existence d'une conversion définie par l'utilisateur de D* en B*.
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!