У меня есть проект, в котором я хотел бы больше использовать умные указатели. В целом, я был успешен в этой цели. Однако я столкнулся с одной вещью, в которой я не уверен, что такое «лучшая практика».
По сути, я хотел бы вернуть «указатель» из функции, но требует , чтобы пользователь удерживал его в интеллектуальном указателе. Более того, я не хочу указывать конкретный умный указатель (общий или ограниченный).
Проблема в основном в том, что, похоже, нет правильного способа повысить scoped_ptr
до shared_ptr
(я думаю, это было бы идеальным решением). Я понимаю, почему они этого не сделали, поскольку это позволило бы передать право собственности, что может привести к некоторым проблемам, таким как std::auto_ptr
.
Однако передача права собственности кажется хорошей идеей для этого дела. Итак, моя идея такова:
// contrived example of factory pattern
std::auto_ptr<A> func() { return std::auto_ptr<A>(new A); }
Это работает "хорошо", так как и scoped_ptr
, и shared_ptr
имеют конструкторы, которые берут в собственность std::auto_ptr
.
Итак, мой вопрос: это хорошая практика? Есть ли лучшее решение? Единственная реальная альтернатива, которую я смог придумать, - это использовать шаблон шаблона в качестве возвращаемого значения, например:
// similar to above example
template <template <typename> class P>
P<A> func() { return P<A>(new A); }
, который на самом деле мог бы хорошо работать, за исключением того, что я думаю, что потребуется некоторая работа, чтобы заставить его работать с scoped_ptr
.
Мысли