C++ 仅对一个派生类型的std::map和基指针进行迭代

C++ 仅对一个派生类型的std::map和基指针进行迭代,c++,collections,polymorphism,std,C++,Collections,Polymorphism,Std,我在控制器类中有一个std::mapm_项 控制器将项目提供给外部消费者,他们只需要base,因此多态性非常适合这一点。但是,在内部,当某些事件发生时,控制器需要更新或删除特定类型的项。更新在本质上是非常不同的,每个事件需要不同的数据集,所以我不能在基类中只使用一个通用的“update”方法。我需要的是一种在事件发生时仅迭代某些派生类型(然后我需要将其转换为派生类型指针)的方法。一种解决方案是在基中添加一个EDerivedType GetType(),每个派生类型返回一个不同的枚举值,以便在迭代

我在控制器类中有一个
std::map
m_项

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

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

谢谢…

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


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

我想您已经领会了这个想法:“我需要的是一种在事件发生时只迭代某些派生类型(然后我需要将其转换为派生类型指针)的方法。”


您可以保留一个
std::map
,并直接找到相应的控制器。另外,控制器应该是多态基类。

我不能有太多的控制器。我需要一个控制器来控制所有的逻辑。因此,拥有大量的控制器类是不可能的。如果我为每种类型使用一个映射,它可能会工作,但我最终会得到大约20个映射,这将是一个混乱的代码。我想让它在一个派生类型上迭代,只在一个集合中作为指向基的指针的所有对象中进行迭代。这不起作用,因为操作非常不同。就控制器而言,每种类型都有很大的不同。所有派生类型的唯一共同点是它们都可以被绘制,但每个派生类型都是我的应用程序的逻辑部分,代表一组不同的数据。@sprite-在访问者的
visit
函数中,您可以获取对象本身并编写特定于对象的代码。我看不出具体的物体之间有什么不同。好吧,我想我以前误解你了。因此,如果我正确理解了您的意图,那么访问者将是一个表示事件和相关数据的类。我需要对VisitorBase类中的每个派生类型进行一次访问(派生&),该类的默认实现不做任何操作。然后,我将为每个操作从该类继承,其中我仅重载所需派生类型的访问以执行所需的操作。这是正确的吗?@sprite-是的。只有一件事-您可以为每个
派生的
使用不同的派生访问者,或者将所有(或部分)的逻辑放在一个类中-特别是如果他们可以重用某些代码(根据您所说的,不会有剪切的代码)。使用一个类的第二个优点是,您只需运行一次列表。