面试题答案
一键面试场景设计
假设我们有一个图形绘制系统,不同类型的图形(如圆形、矩形等)都有自己的绘制方法。我们希望在编译期根据图形类型选择合适的绘制函数。
原理阐述
模板元编程允许我们在编译期进行计算和决策。通过模板特化,我们可以针对不同的类型参数提供不同的实现。结合指针,我们可以实现类似多态的行为,在编译期确定调用哪个函数。
代码示例
#include <iostream>
// 基类
class Shape {
public:
virtual void draw() const = 0;
virtual ~Shape() = default;
};
// 圆形类
class Circle : public Shape {
public:
void draw() const override {
std::cout << "Drawing a circle." << std::endl;
}
};
// 矩形类
class Rectangle : public Shape {
public:
void draw() const override {
std::cout << "Drawing a rectangle." << std::endl;
}
};
// 模板元编程选择函数
template <typename T>
void drawShape(const Shape* shape) {
static_assert(false, "Unsupported shape type");
}
template <>
void drawShape<Circle>(const Shape* shape) {
static_cast<const Circle*>(shape)->draw();
}
template <>
void drawShape<Rectangle>(const Shape* shape) {
static_cast<const Rectangle*>(shape)->draw();
}
int main() {
Circle circle;
Rectangle rectangle;
drawShape<Circle>(&circle);
drawShape<Rectangle>(&rectangle);
return 0;
}
性能优缺点
- 优点:
- 编译期决策,没有运行时的虚函数表查找开销,提高了运行效率。
- 可以利用编译期优化,生成更高效的代码。
- 缺点:
- 代码膨胀,因为针对不同类型参数会生成不同的代码实例。
维护优缺点
- 优点:
- 类型安全,编译期检查可以避免很多运行时错误。
- 逻辑清晰,模板特化使得不同类型的处理逻辑分离。
- 缺点:
- 模板代码复杂,可读性较差,维护成本较高。
- 当新增类型时,需要添加新的模板特化,可能影响已有代码。