我正在用 C 實作一個使用 ECS(物體-組件-系統)的游戲引擎。
每個都GameObject可以有多個Components (存盤在GameObject's 中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定義了那些s:
class TerrainComponent { /* ... */ }
class PerlinTerrainComponent : public TerrainComponent { /* ... */ }
class FlatTerrainComponent : public TerrainComponent { /* ... */ }
// And possibly many more
并且有 world GameObjects,它們都TerrainComponent附加了一個's 派生類。
我的問題是我需要一種方法來獲得TerrainComponent一個世界,就像這樣:
TerrainComponent* TC = world.GetComponent<TerrainComponent>();
并獲得TerrainComponent與世界相關的任何型別(實際上,這將是一個TerrainComponent派生類)。
是否有可能在 C 中實作一個允許我這樣做的方法(獲取一個類的所有派生類),而無需手動更新TerrainComponent派生類串列?
uj5u.com熱心網友回復:
假設這些類都是多型/動態的(它們需要像這樣使用 typeid),您可以只使用 dynamic_cast 代替:
template <typename T> T* GetComponent() {
for (Component* c : _components) {
if (T *tc = dynamic_cast<T *>(c)) return tc;
}
return nullptr;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/405354.html
標籤:
下一篇:如何用模板型別宣告概念函式簽名?
