我一直在设计类,它们都遵循这样的习惯用法,即它们的共享指针类型在它们的命名空间中可用,使用如下代码:
class ClassName
{
public:
typedef std::shared_ptr<ClassName> ptr;
}
可以编写如下代码:
ClassName::ptr p=std::make_shared<ClassName>();
现在,我想将该代码分解为一个基类。它可以让我神奇地在一个地方添加weak_ptr 支持,并指出哪些类符合该协议,并且通常更容易构建这些功能。
我是否被迫使用模板?
一种方法是遵循 enable_shared_from_this<> 方法。
template <typename T>
class SmartPointer
{
public:
typedef std::shared_ptr<T> ptr;
typedef std::weak_ptr<T> wptr;
}
允许我定义这样的类:
class ClassName:public SmartPointer<ClassName>
...
但是让我觉得必须将 ClassName 指定为模板参数很笨拙。我想做的是能够在编译时识别派生类的类型,用下面的 derivedClassType() 代替:
class SmartPointer
{
public:
typedef std:shared_ptr<derivedClassType()> ptr;
typedef std:weak_ptr<derivedClassType()> wptr;
}
class ClassName: public SmartPointer
...
似乎编译器必须在编译时知道该信息作为一种隐含的模板参数......这具有确保引用的类型是派生类而不是基类的额外好处。
有没有一种语法可以使这成为可能?