MST

星途 面试题库

面试题:C++ 单继承代码复用中模板元编程与策略模式的融合

在C++ 单继承的代码复用场景中,结合模板元编程和策略模式,实现一个图形渲染框架。框架中有一个基类`RendererBase`,不同的渲染策略(如OpenGL渲染策略、DirectX渲染策略)作为模板参数,派生类通过继承`RendererBase`并传入不同策略模板参数来复用基础渲染逻辑,同时实现不同的渲染效果。请详细设计并实现该框架,说明模板元编程和策略模式是如何协同工作来优化代码复用和扩展性的。
31.9万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试
  1. 设计思路
    • 策略模式:将不同的渲染策略(OpenGL、DirectX等)封装成独立的类,每个类实现特定的渲染方法。
    • 模板元编程:通过模板参数将不同的策略类传递给派生类,在编译期确定使用的渲染策略,以实现代码复用和扩展性。
  2. 代码实现
// 渲染策略基类
class RenderStrategyBase {
public:
    virtual void render() = 0;
    virtual ~RenderStrategyBase() = default;
};

// OpenGL渲染策略
class OpenGLRenderStrategy : public RenderStrategyBase {
public:
    void render() override {
        std::cout << "Using OpenGL to render." << std::endl;
    }
};

// DirectX渲染策略
class DirectXRenderStrategy : public RenderStrategyBase {
public:
    void render() override {
        std::cout << "Using DirectX to render." << std::endl;
    }
};

// 渲染器基类
template <typename Strategy>
class RendererBase {
protected:
    Strategy strategy;
public:
    void performRender() {
        strategy.render();
    }
};

// OpenGL渲染器派生类
class OpenGLRenderer : public RendererBase<OpenGLRenderStrategy> {
public:
    void render() {
        performRender();
    }
};

// DirectX渲染器派生类
class DirectXRenderer : public RendererBase<DirectXRenderStrategy> {
public:
    void render() {
        performRender();
    }
};
  1. 模板元编程和策略模式协同工作说明

    • 模板元编程:在RendererBase模板类中,通过模板参数<typename Strategy>指定使用的渲染策略类。在编译期,编译器会根据传入的模板参数生成不同的RendererBase实例化版本。例如,OpenGLRenderer继承自RendererBase<OpenGLRenderStrategy>DirectXRenderer继承自RendererBase<DirectXRenderStrategy>,这样不同的渲染器可以复用RendererBase中的基础渲染逻辑(如performRender方法)。
    • 策略模式:每个渲染策略类(如OpenGLRenderStrategyDirectXRenderStrategy)继承自RenderStrategyBase,实现了特定的render方法。RendererBase通过组合的方式持有一个Strategy类型的对象,并在performRender方法中调用其render方法,从而实现不同的渲染效果。这种方式使得添加新的渲染策略变得容易,只需要创建一个新的继承自RenderStrategyBase的策略类,并在需要使用该策略的渲染器中通过模板参数传入即可,无需修改已有的代码,大大提高了代码的扩展性。
  2. 测试代码

#include <iostream>
int main() {
    OpenGLRenderer openglRenderer;
    openglRenderer.render();

    DirectXRenderer directXRenderer;
    directXRenderer.render();

    return 0;
}

这个框架通过模板元编程和策略模式的结合,有效地实现了代码复用和扩展性,能够轻松应对不同渲染策略的需求变化。