在C++中,模板元编程(TMP)是一种在编译时执行计算的技术,它允许程序员编写在编译时生成和优化代码的程序。策略模式是一种行为设计模式,它允许在运行时选择算法的行为。结合TMP和策略模式,我们可以在编译时根据不同的类型选择不同的算法实现。
以下是一个使用C++模板元编程实现策略模式的示例:
首先,我们定义一个策略接口,通常使用纯虚函数表示:
template <typename T>
class Strategy {
public:
virtual ~Strategy() = default;
virtual T execute(const T& input) const = 0;
};
然后,我们为每种具体策略实现这个接口。例如,我们可以有一个加法策略和一个乘法策略:
template <typename T>
class AddStrategy : public Strategy<T> {
public:
T execute(const T& input) const override {
return input + input;
}
};
template <typename T>
class MultiplyStrategy : public Strategy<T> {
public:
T execute(const T& input) const override {
return input * input;
}
};
接下来,我们创建一个上下文类,它包含一个指向策略对象的指针,并使用模板特化来根据类型选择合适的策略:
template <typename T, typename StrategyType = void>
class Context;
template <typename T>
class Context<T, std::enable_if_t<!std::is_same_v<Strategy<T>, MultiplyStrategy<T>>>> {
public:
Context(Strategy<T>* strategy) : strategy_(strategy) {}
T execute(const T& input) const {
return strategy_->execute(input);
}
private:
Strategy<T>* strategy_;
};
template <typename T>
class Context<T, std::enable_if_t<std::is_same_v<Strategy<T>, MultiplyStrategy<T>>>> {
public:
Context(Strategy<T>* strategy) : strategy_(strategy) {}
T execute(const T& input) const {
return strategy_->execute(input * input);
}
private:
Strategy<T>* strategy_;
};
注意,这里使用了std::enable_if
和SFINAE(Substitution Failure Is Not An Error)技术来根据模板参数的类型选择不同的上下文类实现。
最后,我们可以使用这些类来执行不同的策略:
int main() {
Context<int> addContext(&AddStrategy<int>());
Context<int> multiplyContext(&MultiplyStrategy<int>());
int resultAdd = addContext.execute(5); // 结果为 5 + 5 = 10
int resultMultiply = multiplyContext.execute(5); // 结果为 5 * 5 = 25
return 0;
}
在这个例子中,Context
类根据模板参数T
的类型在编译时选择合适的策略实现。注意,由于策略模式和模板元编程都是在编译时工作的,因此运行时的性能开销非常小。