如何解决由模板函数引起的循环依赖?
例如,我定义了一个 Engine 类,它存储一个实体列表,并负责创建实体并从中添加/删除组件。
class Engine
{
public:
Entity CreateEntity();
template <typename T, typename... Args>
void AddComponentToEntity(Entity& entity, Args... args)
{
// Code to add component to entity
}
template <typename T>
void RemoveComponentFromEntity(Entity& entity)
{
// Code to remove component from entity
}
private:
std::vector<Entity> entities;
};
然后,我还在实体类中添加了函数来“包装”这些函数,从而为向实体添加组件提供了一种很好的语法。
class Entity
{
public:
template <typename T, typename... Args>
void AddComponent(Args... args)
{
engine->AddComponentToEntity<T>(*this, args...);
}
template <typename T>
void RemoveComponent()
{
engine->RemoveComponentFromEntity<T>(*this);
}
private:
Engine* engine;
};
这使我可以编写这样的代码
entity.AddComponent<PhysicsComponent>(Arguments..);
不必在任何地方直接引用引擎对象
engine->AddComponentToEntity(entity, Arguments..);
但是,由于引擎类包含实体实例,因此它必须包含实体类。然后实体类必须包含引擎类,以便模板函数调用方法,这会导致循环依赖。
如果函数不是模板,这很容易解决,因为可以将实现放在 Entity.cpp 中,然后我可以在其中包含 Engine 类。我正在努力了解如何使用模板函数完成相同的操作。