仅在一个具有基指针的std::map派生类型上进行迭代

Iteration over one derived type only of std::map with base pointers

本文关键字:派生 map 类型 std 迭代 指针 一个      更新时间:2023-10-16

我在控制器类中有一个std::map<int, std::shared_ptr<base>> m_items。

控制器将项目提供给外部消费者,他们只需要基本功能,因此多态性非常适用。然而,当某些事件发生时,控制器内部需要更新或删除特定类型的项目。更新的性质非常不同,每个事件需要不同的数据集,所以我不能在基类中只有一个通用的"更新"方法。当事件发生时,我需要的是一种只在某些派生类型上迭代的方法(然后我需要将其转换为派生类型指针)。一种解决方案是在基中添加一个EDerivedType GetType(),每个派生类型都返回一个不同的枚举值,这样当我迭代时,我就可以与所需的类型进行比较。虽然这是有效的,但它不是OO方法。

有人能建议一种更优雅的方法吗?

谢谢。。。

我认为Visitor设计模式可以为您工作。基类将有一个抽象的accept,它将访问者作为参数。

每个对象都将有一个accept,它将调用正确的访问者函数来进行更新。

我想你已经明白了这个想法:"我需要的是一种方法,当事件发生时,只在某些派生类型上迭代(然后我需要将其转换为派生类型指针)。"

您可以保留一个std::map< EDerivedType, Controlloer *>并直接找到相应的控制器。此外,Controller应该是一个多态性基类。