Conversion de type implicite dans les modèles avec des fonctions d'opérateur ami
Pour utiliser la conversion de type implicite avec des modèles, une technique fréquemment utilisée est la définition d'un fonction ami non membre dans la définition de la classe modèle.
En C , les fonctions de modèle ne sont pas instanciées tant qu'elles ne sont pas invoquées avec des types spécifiques. Lors de la résolution de surcharge, le compilateur déduit les types de paramètres du modèle et élimine tous les modèles qui ne correspondent pas exactement aux types d'arguments, à l'exclusion des conversions implicites.
La solution réside dans l'utilisation d'une fonction d'opérateur ami définie à l'intérieur du modèle. définition de classe. Pour chaque instanciation de modèle, le compilateur génère une fonction gratuite non-modèle avec une signature correspondant aux types substitués.
Par exemple, considérez :
template <typename T> class test { friend test operator+(test const &, test const &) { return test(); } };
Lorsque le modèle est instancié avec int, le compilateur crée une fonction non-modèle :
test<int> operator+(test<int> const &, test<int> const &) { return test<int>(); }
Cette fonction, disponible via une recherche dépendante des arguments, effectue des conversions implicites sur ses arguments. En effet, il est défini en dehors de la classe de modèle et ne nécessite pas de correspondances de type exactes lors de la résolution de surcharge.
Ainsi, les conversions de type implicites deviennent possibles lors de l'appel de l'opérateur sur des objets de type test
A<3> a(4); A<3> b = a + 5; A<3> c = 5 + a;
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!