我不想写每个使用shared_ptr或unique_ptr的类:
std::shared_ptr<Foo> p = CreateFoo();
我正在使用它:
template <typename T>
struct ptr_types
{
typedef std::shared_ptr<T> sptr;
typedef std::unique_ptr<T> uptr;
};
class A: public ptr_types<A>
{
public:
A(){}
int m;
};
然后,我可以这样做:
A::sptr p(new A);
从设计的角度继承使用智能指针的类是否存在问题?有更优雅的解决方案吗?
修改
是的我可以使用:
auto p = std::make_shared<A>();
但是,如果我有这个:
std::shared_ptr<A> A::CreateA()
{
....
}
void A::Sink(std::unique_ptr<A> p)
{
...
}
最好有类似的东西吗?
A::sptr A::CreateA()
{
...
}
void A::Sink(A::uptr p)
{
...
}
也许这个问题没有意义..而且我一直懒得在函数类型返回或参数中编写std :: blabla。
答案 0 :(得分:0)
创建(智能)类的指针不应该是那个类的责任。我不认为添加这样的行为是个好主意,但是如果你想这样做,我认为你的创建者功能应该使用完美转发,所以你可以传递参数用于构造:
template<typename T, typename... Args>
std::unique_ptr<T> CreateA(Args&&... args)
{
return std::make_shared<T>(std::forward<Args>(args)...);
}
使用std :: make_shared(如果你有C ++ 0x14,则使用std :: make_unique)是创建廉价分配对象的标准解决方案。我认为不需要任何其他解决方案。