【发布时间】: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<A>(); -
@FrameBuffer,可以加
using typename ptr_types<A>::sptr; using typename ptr_types<A>::uptr;解决歧义 -
@JonathanWakely 我认为你不需要
typename?它不依赖。 -
“更优雅”是指“更短”还是“更容易理解”?对于比您的个人惯例更熟悉标准库的任何人来说,代码的阅读频率通常比编写的频率高,
std::shared_ptr<A>比A::sptr更具可读性。
标签: c++ c++11 inheritance smart-pointers