我一直在设计类,它们都遵循这样的习惯用法,即它们的共享指针类型在它们的命名空间中可用,使用如下代码:
class ClassName
{
public:
typedef std::shared_ptr<ClassName> ptr;
}
使编写这样的代码成为可能:
ClassName::ptr p=std::make_shared<ClassName>();
现在,我想将该代码分解为一个基类。它可以让我神奇地在一个地方添加 weak_ptr 支持,并指示哪些类符合此协议(protocol),并且通常可以更轻松地构建功能。
我是否被迫使用模板?
一种方法是遵循 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
...
似乎编译器必须在编译时知道该信息作为一种隐含的模板参数...这具有确保引用的类型是派生类而不是基类的额外好处。
是否有一种语法可以使这成为可能?
最佳答案
enable_shared_from_this
使用的方法称为 CRTP,即“奇怪的重复模板模式”。您需要指定派生类;基类模板无法询问谁将其用作基类。
但是您可以在您的 CRTP 基础中继承 enable_shared_from_this
并避免两次指定派生类名称。
关于c++ - 在 C++ 的编译时获取派生类的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17735852/