55 votes

unique_ptr boost équivalent?

Existe-t-il une classe équivalente pour std :: unique_ptr dans les bibliothèques boost de C ++ 1x? Le comportement que je recherche, c’est de pouvoir avoir une fonction d’usine exceptionnellement sûre, comme si ...

 std::unique_ptr<Base> create_base()
{
    return std::unique_ptr<Base>(new Derived);
}

void some_other_function()
{
    std::unique_ptr<Base> b = create_base();

    // Do some stuff with b that may or may not throw an exception...

    // Now b is destructed automagically.
}
 

EDIT: En ce moment, j'utilise ce hack, qui semble être le meilleur que je puisse obtenir à ce stade ...

 Base* create_base()
{
    return new Derived;
}

void some_other_function()
{
    boost::scoped_ptr<Base> b = create_base();

    // Do some stuff with b that may or may not throw an exception...

    // Now b is deleted automagically.
}
 

68voto

jalf Points 142628

Il n'est pas possible de créer quelque chose comme unique_ptr sans C++0x (où il fait partie de la bibliothèque standard, et ainsi de Boost n'a pas besoin de les fournir).

Sans références rvalue, qui sont d'une fonction en C++0x, une mise en œuvre robuste de unique_ptr est impossible, avec ou sans coup de pouce.

En C++03, il existe quelques alternatives possibles, bien que ont chacun leurs défauts.

  • boost::shared_ptr est probablement le plus simple de remplacement en termes de capacité. Vous pouvez l'utiliser en toute sécurité n'importe où vous auriez autrement utiliser un unique_ptr et il avait un travail. Il ne serait pas aussi efficace, en raison de l'ajout de comptage de référence. Mais si vous êtes à la recherche d'un simple remplacement drop-in, qui est capable de gérer tout ce unique_ptr peut faire, c'est probablement votre meilleur pari. (Bien sûr, un shared_ptr peut faire beaucoup plus, mais il peut aussi simplement être utilisé comme un remplacement pour unique_ptr.)
  • boost::scoped_ptr est similaire à l' unique_ptr mais n'autorise pas le transfert de propriété. Il fonctionne très bien tant que le pointeur intelligent est destinée à conserver la propriété exclusive tout au long de sa durée de vie.
  • std::auto_ptr fonctionne de manière très similaire à l' unique_ptr, mais a quelques limitations, surtout qu'il ne peut pas être stockés dans les conteneurs de la bibliothèque standard. Si vous êtes simplement à la recherche d'un pointeur qui permet le transfert de la propriété, mais qui n'est pas destiné à être stocké dans des conteneurs ou copié autour, c'est probablement un bon pari.

10voto

Michael Burr Points 181287

Vous voudrez peut-être essayer la "preuve de concept" de Howard Hinnant en implémentation unique_ptr<> pour C ++ 03 (disclaimer - je ne l'ai pas déjà fait):

Un de ses exemples renvoie un unique_ptr<int> :

 unique_ptr<int> factory(int i)
{
    return unique_ptr<int>(new int(i));
}
 

5voto

fbrereto Points 21711

Que diriez-vous de unique_ptr de la bibliothèque interprocess ?

4voto

deft_code Points 19418

J'ai utilisé Howard Hinnant de unique_ptr. Si vous n'êtes pas très bon à la lecture de fou métaprogrammation erreurs de compilateur vous que vous pourriez vouloir éviter. Il n'a cependant agir comme un unique_ptr dans 90% des cas.

Sinon, je te suggère de passer paramétrée en tant que boost::scoped_ptr& et swap en interne pour voler la propriété. Pour obtenir unique_ptr style de valeurs de retour utiliser un auto_ptr. La Capture de l' auto_ptr de la valeur de retour dans une shared_ptr ou scoped_ptr afin d'éviter à l'aide de l' auto_ptr directement.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X