J'ai un projet dont j'aimerais utiliser davantage les pointeurs intelligents. Dans l'ensemble, j'ai réussi à atteindre cet objectif. Cependant, j'ai rencontré une chose dont je ne suis pas sûr de savoir ce que sont les «meilleures pratiques».renvoyant un 'pointeur' qui doit être tenu par un pointeur intelligent
Fondamentalement, je voudrais retourner un "pointeur" d'une fonction, mais exige que l'utilisateur le maintient dans un pointeur intelligent. Non seulement cela, je ne veux pas mandater un pointeur intelligent particulier (partagé vs portée). Le problème est surtout qu'il ne semble pas y avoir une bonne façon de mettre à niveau un scoped_ptr
vers un shared_ptr
(ce serait la solution idéale je pense). Je comprends pourquoi ils ne l'ont pas fait, car cela permettrait le transfert de propriété, ce qui peut conduire à des problèmes comme ceux que connaît le std::auto_ptr
.
Cependant, le transfert de propriété semble être une bonne idée pour ce cas. Donc, mon idée est comme ceci:
// contrived example of factory pattern
std::auto_ptr<A> func() { return std::auto_ptr<A>(new A); }
Cela fonctionne « ok » puisque les deux scoped_ptr
et shared_ptr
ont des constructeurs qui prennent la propriété d'un std::auto_ptr
. Donc, ma question est la suivante: est-ce une bonne pratique? Y a-t-il une meilleure solution? La seule alternative que j'ai été en mesure de trouver utilise un modèle de modèle comme la valeur de retour comme ceci:
// similar to above example
template <template <typename> class P>
P<A> func() { return P<A>(new A); }
qui en fait pourrait bien fonctionner sauf que je pense qu'il aurait besoin d'un peu de travail pour l'obtenir à travailler avec un scoped_ptr
aussi.
Pensées?
shared_ptr dans la construction à un seul thread n'utilise pas le comptage atomique des références. –
Vous avez raison, mais par défaut, boost est construit en version multithread. – Artyom
L'avantage d'utiliser scoped_ptr sur auto_ptr est lorsque vous voulez indiquer clairement que vous n'êtes pas censé copier le pointeur. Vous ne pouvez tout simplement pas avec scoped_ptr. Il s'agit de transmettre vos intentions, tout comme votre exemple avec auto_ptr et le transfert de propriété. –