【问题标题】:Is it OK to Inherit from a templated smart pointers types only class从模板化智能指针类型继承是否可以?
【发布时间】:2015-04-22 01:49:16
【问题描述】:

我不想在我使用 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。

【问题讨论】:

  • 如果A 继承自另一个派生自ptr_types 的类怎么办?
  • 我觉得我更喜欢auto p = std::make_shared&lt;A&gt;();
  • @FrameBuffer,可以加using typename ptr_types&lt;A&gt;::sptr; using typename ptr_types&lt;A&gt;::uptr;解决歧义
  • @JonathanWakely 我认为你不需要typename?它不依赖。
  • “更优雅”是指“更短”还是“更容易理解”?对于比您的个人惯例更熟悉标准库的任何人来说,代码的阅读频率通常比编写的频率高,std::shared_ptr&lt;A&gt;A::sptr 更具可读性。

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


【解决方案1】:

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

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

【讨论】:

  • '创建(智能)类指针不应该是该类的职责。' - 您还会在哪里指定客户端使用的指针类型和实现?您还如何实现一个返回指针但又保留部分所有权的函数(例如,memoize 模式 w/o copy)?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多