Conversion de type implicite avec des modèles
La requête explore le problème de l'activation de la conversion de type implicite dans les classes de modèles. Prenons le cas d'une classe de modèle A avec un constructeur qui accepte un entier.
template <unsigned int m> class A { public: A(int); };
De plus, il existe un opérateur ' ' qui renvoie une instance de A étant donné deux objets A.
template<unsigned int m> A<m> operator+(const A<m>&, const A<m>&) { return A<m>(0); }
Le problème survient lorsque l'on tente de convertir implicitement un entier en un objet A. Par exemple, le code suivant tente de le faire, mais le compilateur renvoie une erreur :
A<3> a(4); A<3> b = a + 5; A<3> c = 5 + a;
Solution
La solution réside dans l'exploitation d'une fonctionnalité du langage qui permet la définition de fonctions amies non membres à l'intérieur d'une définition de classe. Dans le cas des modèles, pour chaque instanciation du modèle, le compilateur génère une fonction libre non-modèle avec une signature obtenue en substituant les types réels de l'instanciation dans la déclaration ami :
template <typename T> class test { friend test operator+(test const &, test const &); // [1] }; test<int> t; // [2]
In [ 1], le compilateur permet la définition de la fonction ami à l'intérieur de la portée de la classe. Ensuite, dans [2], lorsque le modèle est instancié, le compilateur génère une fonction libre :
test<int> operator+(test<int> const &, test<int> const &) { return test<int>(); }
Cette fonction non-modèle est toujours définie, qu'elle soit utilisée ou non.
Magie de la conversion implicite
La « magie » réside ici dans les aspects suivants :
Cependant, cette solution présente également quelques limites :
Malgré ces limitations, cette solution fournit un moyen élégant d'activer la conversion implicite au sein des classes de modèles, permettant un code plus flexible et plus pratique. .
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!