基于继承的模板类型限制

时间:2014-10-13 04:00:03

标签: c++ templates game-engine

说我有这样的

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的子类。有没有办法限制类型?

1 个答案:

答案 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
}