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

标签 c++ templates types

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

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/

相关文章:

c++ - asio - 等待异步操作完成

c++ - 如何在 Visual Studio 2017 中为 Windows XP 编译代码

c++ - 折叠表达式和空参数包 : what's the expected result?

c++ - 部分模板模板特化

javascript - 如何在 Rails 中使用 CoffeeScript?

python - 什么时候在 Python 中使用模板引擎?

database - Liquibase 数据类型映射文档

c++ - 矩阵类型 OpenCV

Haskell:if-then-else block 和具有非对称构造函数的数据

c++ - VC++中的多线程程序