面试题答案
一键面试基于模板元编程的方案实现
- 定义继承体系:假设有基类
Base
以及多个派生类Derived1
、Derived2
等。
class Base {
public:
virtual void doSomething() = 0;
};
class Derived1 : public Base {
public:
void doSomething() override {
// 具体实现
}
};
class Derived2 : public Base {
public:
void doSomething() override {
// 具体实现
}
};
- 使用模板元编程进行条件选择:定义一个模板类
Selector
,通过模板特化根据不同条件选择不同的派生类。
template<bool condition>
struct Selector;
template<>
struct Selector<true> {
using type = Derived1;
};
template<>
struct Selector<false> {
using type = Derived2;
};
- 在使用处根据条件实例化合适的类:
int main() {
const bool someCondition = true;
using SelectedType = typename Selector<someCondition>::type;
SelectedType obj;
obj.doSomething();
return 0;
}
原理
模板元编程允许在编译期进行计算和类型选择。通过模板特化机制,编译器可以根据不同的模板参数值选择不同的模板特化版本,从而在编译期确定需要实例化的类型。这样,在运行期就无需进行条件判断来决定实例化哪个类,提高了性能。
关键技术点
- 模板特化:通过对通用模板类进行特化,针对不同的模板参数值提供不同的实现。这是实现条件选择的核心机制。
- 编译期计算:模板参数在编译期就确定,所以基于模板参数的条件判断和类型选择都在编译期完成,避免了运行期的开销。
using
别名:使用using
关键字为选择出来的类型定义别名,方便后续使用,增强代码可读性。