使用Policy模板实现编译期字典
- GPT给出的示例
#include <iostream>
#include <type_traits>
// 基础策略类接口
struct PolicyBase {
virtual void execute() const = 0;
virtual ~PolicyBase() = default;
};
// 策略类A
struct PolicyA : public PolicyBase {
void execute() const override {
std::cout << "Executing Policy A" << std::endl;
}
};
// 策略类B
struct PolicyB : public PolicyBase {
void execute() const override {
std::cout << "Executing Policy B" << std::endl;
}
};
// 编译期字典:通过模板特化选择策略
template <int Key>
struct PolicySelector;
template <>
struct PolicySelector<1> {
using type = PolicyA;
};
template <>
struct PolicySelector<2> {
using type = PolicyB;
};
// 主模板类,接受一个策略类作为模板参数
template <typename Policy>
class Context {
public:
void execute() const {
policy.execute();
}
private:
Policy policy;
};
int main() {
// 使用编译期字典选择策略
using SelectedPolicy1 = PolicySelector<1>::type;
using SelectedPolicy2 = PolicySelector<2>::type;
Context<SelectedPolicy1> context1;
context1.execute(); // 输出 "Executing Policy A"
Context<SelectedPolicy2> context2;
context2.execute(); // 输出 "Executing Policy B"
return 0;
}
PolicyBase
是一个基类接口,定义了一个纯虚函数execute
。PolicyA
和PolicyB
是具体的策略类,实现了execute
方法。PolicySelector
是一个编译期字典,通过模板特化为不同的键选择不同的策略类。Context
是一个模板类,接受一个策略类作为模板参数,并在运行时执行策略的execute
方法。
(END)