繁体   English   中英

如何从 C++ 中的基础 class 获取所有派生类?

[英]How to get all derived classes from a base class in C++?

我正在使用 ECS(实体组件系统)的 C++ 中实现游戏引擎。

每个GameObject可以有多个Component (存储在GameObjectstd::vector<Component*> _components )。

我有一个方法允许我通过指定我想要的Component类型来获取GameObjectComponent

// In GameObject.h
template <typename T> T* GetComponent() {
    for (Component* c : _components) {
        if (typeid(*c) == typeid(T)) return (T*)c;
    }
    return nullptr;
}
// In main.cpp
RandomComponent* RC = gameObject.GetComponent<RandomComponent>();

现在假设我定义了那些Component

class TerrainComponent { /* ... */ }
class PerlinTerrainComponent : public TerrainComponent { /* ... */ }
class FlatTerrainComponent : public TerrainComponent { /* ... */ }
// And possibly many more

并且有世界GameObject s,它们都有一个TerrainComponent的派生 class 附加到它。

我的问题是我需要一种方法来获取世界的TerrainComponent ,如下所示:

TerrainComponent* TC = world.GetComponent<TerrainComponent>();

并获取附加到世界的任何类型的TerrainComponent (实际上,它将是一个TerrainComponent派生类)。

是否有可能在 C++ 中实现一种允许我这样做的方法(获取一个类的所有派生类),而无需手动更新TerrainComponent派生类的列表?

假设这些类都是多态/动态的(它们需要像这样使用 typeid),您可以只使用 dynamic_cast 代替:

template <typename T> T* GetComponent() {
    for (Component* c : _components) {
        if (T *tc = dynamic_cast<T *>(c)) return tc;
    }
    return nullptr;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM