Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 基于继承的模板类型限制_C++_Templates_Game Engine - Fatal编程技术网

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
}