gpt4 book ai didi

c++ - 在 C++ 的编译时获取派生类的类型

转载 作者:行者123 更新时间:2023-11-30 04:16:31 26 4
gpt4 key购买 nike

我一直在设计类,它们都遵循这样的习惯用法,即它们的共享指针类型在它们的命名空间中可用,使用如下代码:

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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com