Maison >développement back-end >C++ >Comment puis-je utiliser des suppresseurs personnalisés avec des membres std::unique_ptr dans une classe C ?

Comment puis-je utiliser des suppresseurs personnalisés avec des membres std::unique_ptr dans une classe C ?

Susan Sarandon
Susan Sarandonoriginal
2024-12-08 12:16:11722parcourir

How Can I Use Custom Deleters with std::unique_ptr Members in a C   Class?

Supprimeurs personnalisés avec membres std::unique_ptr

En C, la classe std::unique_ptr offre un moyen pratique de gérer la propriété du pointeur -objets basés sur. Cependant, si vous travaillez avec des objets tiers qui nécessitent un processus de suppression personnalisé, vous pouvez rencontrer des difficultés lors de l'utilisation de std::unique_ptr en tant que membre d'une classe.

Considérez le scénario suivant : vous disposez d'un classe avec un std::unique_ptr membre. La classe Bar provient d'une bibliothèque tierce et définit ses propres fonctions create() et destroy() pour l'instanciation et la destruction d'objets.

Pour utiliser std::unique_ptr avec un tel scénario dans une fonction autonome, vous peut utiliser un suppresseur personnalisé :

void foo() {
    std::unique_ptr<Bar, void (*)(Bar*)> bar(create(), [](Bar* b) { destroy(b); });
    ...
}

Mais comment pouvez-vous y parvenir lorsque le std::unique_ptr est membre d'un classe ?

Supprimeurs personnalisés dans les membres de la classe

En supposant que créer et détruire sont des fonctions gratuites avec les signatures suivantes :

Bar* create();
void destroy(Bar*);

Vous pouvez définir votre classe Foo comme suit :

class Foo {

    std::unique_ptr<Bar, void (*)(Bar*)> ptr_;

    // ...

public:

    Foo() : ptr_(create(), destroy) { /* ... */ }

    // ...
};

Dans cette implémentation, vous fournissez directement la fonction destroy en tant que suppresseur pour le std :: unique_ptr. En utilisant une fonction gratuite comme suppresseur, vous évitez le besoin de lambdas ou de classes de suppression personnalisées.

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!

Déclaration:
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