我正在研究游戏引擎原型(prototype)并有以下问题:
现在我的引擎实现是 DirectX 绑定(bind)的,一切正常。
我有一个 core::Renderer
类,它具有渲染几何、设置着色器、闪电等的方法...
有些是模板化的,有些不是。
class Renderer {
// ...
template <typename Geometry> RenderGeometry(shared_ptr<Geometry> geometry);
};
假设我想扩展我的引擎的灵 active ,但我不希望它使用 DirectX 和 OpenGL 工作。据我现在的理解,这个想法是将所有特定于接口(interface)的东西都带到基类 core::Renderer
中,使所有这些调用成为 virtual
然后提供它们的 特定于 DirectX 和 特定于 OpenGL 的实现。
如果我的几何对象不是模板,一切都会看起来更好:
class Renderer {
virtual void RenderGeometry(shared_ptr<core::Non_template_Geometry> geometry);
};
class DXRenderer {
// Here goes our custom implementation
// for DirectX-based geometry rendering
virtual void RenderGeometry(...)
};
// The same for OpenGL
第一个(初始变体)的问题是不允许对虚函数进行模板化。
那么问题来了——我该如何解决?
对于这种情况或模板虚拟函数仿真有任何技巧/技巧/模式吗?
最佳答案
使用基 Geometry
类:
class Geometry {
public:
virtual ~Geometry() { }
virtual void Render() = 0;
};
并让您的每个几何类型类派生自该基类,并通过重写 Render
实现它们的特定渲染功能。
然后,Renderer::RenderGeometry
不需要是函数模板;它可以简单地获取指向 Geometry
基类的指针并调用虚函数 Render
。
关于C++ - 设计问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3392596/