是否可以从模板化的智能指针类型继承类

Fra*_*fer 5 c++ inheritance smart-pointers c++11

我不想写每个使用shared_ptr或unique_ptr的类:

std::shared_ptr<Foo> p = CreateFoo();
Run Code Online (Sandbox Code Playgroud)

我正在使用这个:

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;
};
Run Code Online (Sandbox Code Playgroud)

然后,我可以这样做:

A::sptr p(new A);
Run Code Online (Sandbox Code Playgroud)

从设计的角度继承使用智能指针的类是一个问题吗?有更优雅的解决方案吗?

编辑:

是的我可以使用:

auto p = std::make_shared<A>();
Run Code Online (Sandbox Code Playgroud)

但如果我有这个怎么办:

std::shared_ptr<A> A::CreateA()
{
....
}

void A::Sink(std::unique_ptr<A> p)
{
...
}
Run Code Online (Sandbox Code Playgroud)

有更好的东西吗?

A::sptr A::CreateA()
{
...
}

void A::Sink(A::uptr p)
{
...
}
Run Code Online (Sandbox Code Playgroud)

也许这个问题没有意义..而且我一直懒得在函数类型返回或参数中编写std :: blabla.

Mac*_*bły 0

创建类的(智能)指针不应该是该类的责任。我不认为添加这样的行为是个好主意,但如果你想这样做,我认为你的创建者函数应该使用完美转发,这样你就可以传递构造参数:

template<typename T, typename... Args>
std::unique_ptr<T> CreateA(Args&&... args)
{
    return std::make_shared<T>(std::forward<Args>(args)...);
}
Run Code Online (Sandbox Code Playgroud)

单独使用 std::make_shared (如果你有 C++0x14,则使用 std::make_unique )是创建廉价分配对象的标准解决方案。我认为不需要任何额外的解决方案。