Comment faire effectuer un dynamic_cast avec un unique_ptr?

J'ai une hiérarchie de classes comme suit:

class BaseSession : public boost::enable_shared_from_this<BaseSession>
class DerivedSessionA : public BaseSession
class DerivedSessionB : public BaseSession

Au sein de la classe dérivée de fonctions, j'ai régulièrement fonctions d'appel comme ceci:

Func(boost::dynamic_pointer_cast<DerivedSessionA>(shared_from_this()));

Depuis que je travaille avec shared_ptr pour gérer les sessions, cela fonctionnait bien. Récemment, j'ai découvert que mon utilisation de shared_ptr n'est pas optimale pour ce cas. C'est parce que ces séances sont singleton objets de maintenir un socket par client. Si le socket est rétablie, la session de copies destinées à devenir des zombies.

Comme solution de contournement, j'ai commencé à passer shared_ptr par référence plutôt que des copies. Cela a résolu le zombie problème.

Idéalement, j'ai senti que je devais être à l'aide de unique_ptr pour stocker la session et ensuite passer des références à d'autres fonctions. Qui a ouvert toute une boîte de pandore.

Comment puis-je cast une classe de base unique_ptr objet de classe dérivée unique_ptr objet? Qu'est-ce que le unique_ptr version de la ligne suivante?

Func(boost::dynamic_pointer_cast<DerivedSessionA>(shared_from_this()));

Je veux juste une copie de l'objet session, tout le reste doit être de référence.

Ce qui devrait se produire avec votre objet pointu si la dynamique de la conversion échoue? Doit-il être supprimé ou avez-vous seulement s'attendre à un mouvement que si la fonte et réussit jamais à les supprimer?
Si dynamic_cast échoue, la touche Func obtient un objet nul, et il annule l'opération. Je ne veux pas bouger, le propriétaire doit rester la même.
Je pense que je suis à la recherche d'un weak pour unique objet. Court de revenir à C pointeur, est-il un autre choix?
Réponse courte: non. unique_ptr implique la propriété. Des pointeurs faibles exiger l'observation de la logique qui sous-entend de verrouillage et de compteurs refcount. Qui vient à un prix, qui est pourquoi vous devez utiliser des shared_ptr si vous êtes si incliné. La bonne nouvelle est que vous pouvez utiliser std::dynamic_pointer_cast<> avec qui trop (et weak_ptr). Tout le monde gagne.
Je suis d'accord avec sehe. La création d'un unique_ptr ce point à une ressource déjà possédé par un autre pointeur intelligent, sans déplacement de la ressource entre les deux récipients est faux. Un weak n'a pas la propriété de la ressource pointée mais une faiblesse de référence: ainsi, toute opération à partir du weak à la unique_ptr est tout simplement impossible ou fortement découragé

OriginalL'auteur Sharath | 2014-10-15