C++ - 设计问题

标签 c++ templates virtual

我正在研究游戏引擎原型(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/

相关文章:

c++ - 如何计算将 n 个不同的球涂成恰好 c 种不同颜色的方法?

c++ - 通过 C 绑定(bind)公开 C++ 库

c++ - 这种继承有什么问题?

c++ - 将容器 value_type 作为模板参数传递?

c++ - 为什么人们将 virtual 关键字放在 std::exception::what() 前面?

c++ - 在eclipse中调试大输入

c++ - 为什么数组会衰减到模板函数中的指针

c++ - 带有 OO 的模板导致 Unresolved external symbol 问题

c++ - 在派生类中调用模板基类的cast操作符

c++ - 调用虚拟方法的不同方式