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
相关产品推荐
相关产品推荐

