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

时间:2015-02-20 11:35:26

标签: c++ c++11 inheritance smart-pointers

我不想写每个使用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。

1 个答案:

答案 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)是创建廉价分配对象的标准解决方案。我认为不需要任何其他解决方案。