如何从 C++ 中的基础 class 获取所有派生的 classes?
How to get all derived classes from a base class in C++?
我正在用 C++ 实现一个使用 ECS(实体组件系统)的游戏引擎。
每个GameObject
可以有多个Component
(存储在GameObject
的std::vector<Component*> _components
中)。
我有一个方法可以让我通过指定我想要的 Component
的类型来获得 GameObject
的 Component
:
// 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
,它们都有一个 TerrainComponent
的衍生 class。
我的问题是我需要一种方法来获取世界的 TerrainComponent
,例如:
TerrainComponent* TC = world.GetComponent<TerrainComponent>();
并获得任何类型的 TerrainComponent
附加到世界(实际上,这将是 TerrainComponent
派生的 class)。
是否有可能在 C++ 中实现一个允许我这样做的方法(获取 class 的所有派生 classes),而无需手动更新列表TerrainComponent
导出 classes?
假设这些 类 都是 polymorphic/dynamic(它们需要像这样使用 typeid),你可以只使用 dynamic_cast 来代替:
template <typename T> T* GetComponent() {
for (Component* c : _components) {
if (T *tc = dynamic_cast<T *>(c)) return tc;
}
return nullptr;
}
我正在用 C++ 实现一个使用 ECS(实体组件系统)的游戏引擎。
每个GameObject
可以有多个Component
(存储在GameObject
的std::vector<Component*> _components
中)。
我有一个方法可以让我通过指定我想要的 Component
的类型来获得 GameObject
的 Component
:
// 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
,它们都有一个 TerrainComponent
的衍生 class。
我的问题是我需要一种方法来获取世界的 TerrainComponent
,例如:
TerrainComponent* TC = world.GetComponent<TerrainComponent>();
并获得任何类型的 TerrainComponent
附加到世界(实际上,这将是 TerrainComponent
派生的 class)。
是否有可能在 C++ 中实现一个允许我这样做的方法(获取 class 的所有派生 classes),而无需手动更新列表TerrainComponent
导出 classes?
假设这些 类 都是 polymorphic/dynamic(它们需要像这样使用 typeid),你可以只使用 dynamic_cast 来代替:
template <typename T> T* GetComponent() {
for (Component* c : _components) {
if (T *tc = dynamic_cast<T *>(c)) return tc;
}
return nullptr;
}