Maison > Article > développement back-end > Pourquoi ne puis-je pas transmettre un « conteneur » à un constructeur attendant un « conteneur » ?
Polymorphisme des modèles : quand les modèles ne fonctionnent pas bien
En C, les modèles fournissent un mécanisme puissant pour la programmation générique. Cependant, leur comportement polymorphe présente des limites. Cet article répond à une question concernant l'absence de polymorphisme de modèle dans un scénario spécifique.
La requête
Un utilisateur rencontre une erreur « aucune fonction de correspondance » lors de l'appel d'un constructeur. qui prend un paramètre de type Container
Explorer le polymorphisme
Le polymorphisme permet aux objets de différentes classes d'être traités comme des objets d’une classe de base commune. Cependant, ce comportement ne s'étend pas aux modèles en C . Bien qu'il dérive de l'interface, Foo ne fait pas automatiquement en sorte que Container
La non-covariance des modèles
L'aspect clé ici est le manque de covariance des modèles. Dans les modèles covariants, un type dérivé est automatiquement considéré comme un argument valide pour un modèle qui attend son type de base. Cependant, en C , les modèles ne sont pas covariants.
Conséquences de la covariance
Considérez l'exemple suivant :
class Fruit {...}; class Apple : public Fruit {...}; class Orange : public Fruit {...}; std::vector<Apple>& apple_vec; // Vector of apples std::vector<Fruit>& fruit_vec = apple_vec; // Assignment allowed fruit_vec.push_back(Orange()); // Oops, added an orange to the apple vector!
Comme le souligne l'explication , le traitement covariant des modèles peut conduire à des situations dans lesquelles des types qui devraient être incompatibles sont traités comme compatibles, brisant ainsi la sécurité des types.
Solutions alternatives
Étant donné que les modèles covariants ne sont pas pris en charge dans C , des solutions alternatives doivent être employées. Des assertions statiques ou des caractères génériques limités (disponibles en Java) peuvent être utilisés pour appliquer les relations de type requises. Dans le scénario spécifique mentionné dans la requête, une simple assertion statique peut vérifier que le type de conteneur transmis est bien un conteneur
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!