C++中通过模板结合函数对象或lambda实现策略模式,编译期绑定策略以消除运行时开销。定义如Ascending、Descending等函数对象并重载operator(),再通过模板参数传入Sorter类,实现不同排序逻辑。例如Sorter在编译期生成升序排序代码,避免虚函数调用。C++11后可直接传入lambda,如按奇偶性排序的闭包,并利用decltype推导类型。为简化使用,可用using定义类型别名,如using AscendingSorter = Sorter,提升可读性。该方式具备高性能、类型安全和灵活性,但每种策略组合会实例化独立模板,可能增大代码体积,且要求统一调用接口。若需运行时切换策略,则需改用std::function或虚函数机制。因此,模板策略模式适用于编译期确定行为、追求效率的场景,是泛型编程中实现高内聚低耦合的经典实践。

在C++中,可以通过模板结合函数对象(仿函数)或lambda表达式来实现策略选择模式,这种方式在编译期完成策略绑定,避免运行时多态的开销,同时保持代码的灵活性和可扩展性。
使用函数对象作为策略
定义多个结构体或类作为具体策略,每个策略实现相同的调用接口(如重载
operator()),然后通过模板参数传入主算法类。
例如,实现一个排序器,支持不同比较策略:
struct Ascending {
bool operator()(int a, int b) const {
return a < b;
}
};
struct Descending {
bool operator()(int a, int b) const {
return a > b;
}
};
template
class Sorter {
Strategy strategy;
public:
void sort(std::vector& data) {
std::sort(data.begin(), data.end(), strategy);
}
};
使用方式:
立即学习“C++免费学习笔记(深入)”;
std::vectornums = {3, 1, 4, 1, 5}; Sorter asc_sorter; asc_sorter.sort(nums); // 升序排列 Sorter desc_sorter; desc_sorter.sort(nums); // 降序排列
使用lambda表达式作为策略
C++11以后,lambda也可作为模板策略传入,适合简单逻辑。
华锐行业电子商务系统2.0采用微软最新的.net3.5(c#)+mssql架构,代码进行全面重整及优化,清除冗余及垃圾代码,运行速度更快、郊率更高。全站生成静态、会员二级域名、竞价排名、企业会员有多套模板可供选择;在界面方面采用DIV+CSS进行设计,实现程序和界面分离,方便修改适合自己的个性界面,在用户体验方面,大量使用ajax技术,更加易用。程序特点:一、采用微软最新.net3.5+MSSQL
例如:
auto custom_cmp = [](int a, int b) {
return (a % 2) < (b % 2); // 按奇偶性排序
};
Sorter custom_sorter;
custom_sorter.sort(nums);
编译期策略选择与类型别名
为简化使用,可用
using定义常用策略组合:
using AscendingSorter = Sorter; using DescendingSorter = Sorter ;
这样用户无需显式写模板参数,直接声明即可:
AscendingSorter sorter; sorter.sort(data);
优势与注意事项
优势:
- 性能高:策略在编译期确定,无虚函数调用开销
- 类型安全:错误在编译期暴露
- 灵活:支持函数对象、lambda、普通函数指针等多种形式
注意:
- 每种策略组合会实例化新的模板类型,可能增加代码体积
- 策略接口需统一,通常通过调用操作符一致化
- 若需运行时切换策略,仍需结合std::function或虚函数









