说我有这样的类:
class Scene {
public:
Scene(void);
~Scene(void);
virtual void update(void) = 0;
virtual void construct(void) = 0;
virtual void destroy(void) = 0;
};
class KillTheHedgehogScene : public Scene {
public:
virtual void update(void) override;
virtual void construct(void) override;
virtual void destroy(void) override;
EntitySceneGraph sceneGraph;
};
我有一个SceneManager
类,它是这样的:
class SceneManager {
public:
SceneManager(void);
void loadNewScene(Scene* scene);
Scene* getCurrentScene(void);
void update(void);
private:
Scene* _currentScene;
};
我的代码现在运行的方式,我会通过执行以下操作加载新场景:
_sceneManager->loadNewScene(new KillTheHedgehogScene());
我的问题是,无论这个范围是什么,都进行了分配,现在_sceneManager必须负责它的解除分配。我希望SceneManager
处理分配和释放。我希望能够以这种方式调用我的loadNewScene()
函数:
_sceneManager->loadNewScene<KillTheHedgehogScene>();
这样,场景管理器可以处理对象的分配和释放,并为其提供所有控制。不过我的问题是如何让模板根据继承限制输入类型。例如,我不想打电话:
_sceneManager->loadNewScene<SomeRandomOtherClass>();
SomeRandomOtherClass
不是Scene
的子类。有没有办法限制类型?
答案 0 :(得分:1)
要在提供无效模板参数时获得更好的错误消息,您可以添加static_assert
,例如:
template <typename T>
void loadNewScene()
{
static_assert(std::is_base_of<Scene, T>::value, "Type should inherit from class Scene");
// Your implementation
}