代码之家  ›  专栏  ›  技术社区  ›  Mateusz Biernat

decltype和decltype之间有什么区别?

  •  -1
  • Mateusz Biernat  · 技术社区  · 1 年前

    我有个问题 decltype 不适用 vector .

    矢量 Eq 与类型相同 holder itemGrabbed :

    item* itemGrabbed;
    item* holder;
    std::vector<std::vector<item*>> Eq;
    

    一切都已初始化,等等。

    Eq 存储指向“继承的”对象的指针,例如来自的对象 class itemAxe .

    每一个 item 类和继承的对象具有与此参数相同的构造函数-> grapicsData :

    this->itemGrabbed = new std::remove_pointer<decltype(Eq[x][y]) > ::type{graphicsData};
    this->itemGrabbed = new std::remove_pointer<decltype(holder) > ::type{graphicsData};
    

    我想我可以这样做:

    item* temp=Eq[x][y];
    this->itemGrabbed = new std::remove_pointer<decltype(temp) > ::type{graphicsData};
    

    但我想知道是否可以在没有 temp ?

    问题是第二个选项有效,但我需要使用第一个选项。所有这些都是因为我需要不同的赋值和复制运算符。

    我怎样才能做到这一点?

    1 回复  |  直到 1 年前
        1
  •  0
  •   wohlstad    1 年前

    decltype 由编译器在编译时解析。

    它没有(也不能)考虑基类的指针是否在运行时引用派生类的实例。

    在您的情况下:
    holder temp 都是类型 item* ,因此编译器将解析这2个 下降型 你的问题中的用法是 项目 至于 Eq[x][y] -它实际上是一个 item*& 之后将保持不变 remove_pointer ,这就是为什么它不适用于 new .

    关于运行时的类型推理(在评论中询问):
    C++不支持全反射,因此您无法在运行时检查对象的类型并按原样使用此类型来创建新实例。
    您需要实现一些代码来完成这项繁重的工作,例如某种工厂。
    您可以从以下帖子开始: Possible to instantiate object given its type in C++? .