我有一个项目,希望更多地使用智能指针。总体上,我已经成功实现了这个目标。然而,我遇到了一件事情,不确定什么是“最佳实践”。
基本上,我想从一个函数返回一个“指针”,但要求用户将其保存在智能指针中。不仅如此,我也不想强制使用特定的智能指针(比如shared vs. scoped)。
问题主要在于似乎没有一种合适的方法将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
一起使用。
你有什么想法吗?