C++ 基于继承的模板类型限制
假设我有这样的课程: 我有一个场景管理器类,它是这样的:C++ 基于继承的模板类型限制,c++,templates,game-engine,C++,Templates,Game Engine,假设我有这样的课程: 我有一个场景管理器类,它是这样的: class SceneManager { public: SceneManager(void); void loadNewScene(Scene* scene); Scene* getCurrentScene(void); void update(void); private: Scene* _currentScene; }; 按照我的代码现在的工作方式,我将通过执行以下操作加载新场景: _sc
class SceneManager {
public:
SceneManager(void);
void loadNewScene(Scene* scene);
Scene* getCurrentScene(void);
void update(void);
private:
Scene* _currentScene;
};
按照我的代码现在的工作方式,我将通过执行以下操作加载新场景:
_sceneManager->loadNewScene(new KillTheHedgehogScene());
我的问题是,无论它在什么范围内,都已经进行了分配,现在,场景管理员必须负责它的解除分配。我希望场景管理器同时处理分配和解除分配。我希望能够通过以下方式调用loadNewScene函数:
_sceneManager->loadNewScene<KillTheHedgehogScene>();
通过这种方式,场景管理器可以处理对象的分配和解除分配,并为其提供所有控制。然而,我的问题是如何让模板基于继承限制输入类型。例如,我不想打电话:
_sceneManager->loadNewScene<SomeRandomOtherClass>();
SomeRandomOtherClass不是场景的子类。有没有办法限制类型?要在提供无效模板参数时获得更好的错误消息,您可以添加static_assert,例如:
template <typename T>
void loadNewScene()
{
static_assert(std::is_base_of<Scene, T>::value, "Type should inherit from class Scene");
// Your implementation
}
在loadNewScene中的某个地方,您可能会有_currentsecene=newt或类似内容。若T实际上不是从场景派生的,那个么这将无法编译,所以您自然会有这种保护。如果你想要一个更好的错误消息,总是有静态的断言。啊,很有趣。所以我会默认得到这个功能,你说呢?我很抱歉问了这么一个容易回答的问题,我希望我能投你的一票;这是否也会加快失败时的编译时间,因为类型不是针对整个范围隐式检查的,而是针对第一个断言显式检查的?
template <typename T>
void loadNewScene()
{
static_assert(std::is_base_of<Scene, T>::value, "Type should inherit from class Scene");
// Your implementation
}