You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

decltype处理vector元素与指针的差异及无临时变量实现咨询

解决方案:不借助临时变量用decltype实例化vector中存储的子类对象

问题根源

直接使用decltype(Eq[x][y])会得到item*&类型(因为std::vector::operator[]返回元素的左值引用),此时std::remove_pointer处理后得到的是基类item,而非你需要的子类(如itemAxe),这就是原写法无效的原因。

解决代码

你需要先移除引用类型,再处理指针:

// 写法1:显式移除引用再移除指针
this->itemGrabbed = new std::remove_pointer_t<std::remove_reference_t<decltype(Eq[x][y])>>{graphicsData};

// 写法2:用std::decay_t简化,自动处理引用和指针衰减
this->itemGrabbed = new std::decay_t<decltype(Eq[x][y])>{graphicsData};

补充说明

如果你的目标是在运行时根据Eq[x][y]指向的实际子类类型实例化对象,仅靠编译时的decltype无法实现(因为Eq存储的是基类指针,编译时无法推导运行时的子类类型)。这种情况下你需要:

  • 给基类item添加纯虚的克隆方法(如virtual item* clone(const graphicsData&) const = 0;),子类实现该方法返回自身的新实例;
  • 直接调用this->itemGrabbed = Eq[x][y]->clone(graphicsData);,无需依赖decltype。

内容的提问来源于stack exchange,提问作者Mateusz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 17:25:18