zhouqijie

使用Policy模板实现编译期字典

#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 是一个基类接口,定义了一个纯虚函数 executePolicyAPolicyB 是具体的策略类,实现了 execute 方法。 PolicySelector 是一个编译期字典,通过模板特化为不同的键选择不同的策略类。 Context 是一个模板类,接受一个策略类作为模板参数,并在运行时执行策略的 execute 方法。

(END)