Maison > développement back-end > C++ > Comment convertir en toute sécurité un « unique_ptr » en un type dérivé ?

Comment convertir en toute sécurité un « unique_ptr » en un type dérivé ?

Susan Sarandon
Libérer: 2024-11-17 21:11:02
original
425 Les gens l'ont consulté

How to Safely Downcast a `unique_ptr` to a Derived Type?

Comment effectuer un "Downcasting" avec unique_ptr

Dans certains scénarios de programmation, vous pouvez rencontrer le besoin de convertir un unique_ptr d'une classe de base à un unique_ptr d'une classe dérivée. C'est ce qu'on appelle le « downcasting ». Comprendre comment effectuer cette opération efficacement est crucial pour maintenir la sécurité des types et éviter les erreurs potentielles.

Considérez une situation dans laquelle vous avez des usines qui renvoient unique_ptr d'une classe de base. Cependant, ces usines fonctionnent en interne avec des pointeurs vers divers types dérivés, tels que DerivedA, DerivedB, etc. Vous aurez peut-être besoin d'un moyen de convertir la classe de base renvoyée unique_ptr en un niveau de classe dérivé spécifique, comme illustré dans le pseudocode suivant :

unique_ptr<Derived> ptr = static_cast<unique_ptr<Derived>>(DerivedAFactory());
Copier après la connexion

Bien que cette approche puisse sembler intuitive, elle peut entraîner des erreurs d'exécution ou des erreurs inattendues. comportement. Une solution plus robuste et recommandée consiste à libérer l'objet de la classe de base unique_ptr, puis à convertir le pointeur brut vers le type dérivé souhaité, comme indiqué ci-dessous :

unique_ptr<Derived> CastToDerived(Base* obj) {
    return unique_ptr<Derived>(static_cast<Derived*>(obj));
}
Copier après la connexion

En employant cette technique, vous pouvez effectuer en toute sécurité un downcasting. sans compromettre la sécurité du type. Cependant, gardez à l'esprit que l'opération de libération doit être explicitement effectuée par l'appelant avant d'invoquer la fonction CastToDerived.

Pour répondre aux scénarios dans lesquels les usines résident dans des DLL chargées dynamiquement, vous devrez peut-être envisager d'utiliser des modèles de fonction comme static_unique_ptr_cast et Dynamic_unique_ptr_cast. Ces modèles garantissent que les objets produits sont détruits dans le même contexte dans lequel ils ont été créés. De plus, ils proposent deux variantes de casting :

  • static_unique_ptr_cast : Utilisez ce modèle lorsque vous avez la certitude que le pointeur est une représentation valide du type Derived.
  • dynamic_unique_ptr_cast : Utilisez ce modèle si vous devez vérifier dynamiquement que le pointeur est une représentation valide du type Derived via Dynamic_cast.

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