
在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<typename Strategy>
class Sorter {
Strategy strategy;
public:
void sort(std::vector<int>& data) {
std::sort(data.begin(), data.end(), strategy);
}
};
使用方式:
std::vector<int> nums = {3, 1, 4, 1, 5};
Sorter<Ascending> asc_sorter;
asc_sorter.sort(nums); // 升序排列
Sorter<Descending> desc_sorter;
desc_sorter.sort(nums); // 降序排列
</font>
使用lambda表达式作为策略
C++11以后,lambda也可作为模板策略传入,适合简单逻辑。
例如:
Post AI
博客文章AI生成器
50
查看详情
auto custom_cmp = [](int a, int b) {
return (a % 2) < (b % 2); // 按奇偶性排序
};
Sorter<decltype(custom_cmp)> custom_sorter;
custom_sorter.sort(nums);
编译期策略选择与类型别名
为简化使用,可用
using定义常用策略组合:
using AscendingSorter = Sorter<Ascending>; using DescendingSorter = Sorter<Descending>;
这样用户无需显式写模板参数,直接声明即可:
AscendingSorter sorter; sorter.sort(data);优势与注意事项
优势:
- 性能高:策略在编译期确定,无虚函数调用开销
- 类型安全:错误在编译期暴露
- 灵活:支持函数对象、lambda、普通函数指针等多种形式
注意:
- 每种策略组合会实例化新的模板类型,可能增加代码体积
- 策略接口需统一,通常通过调用操作符一致化
- 若需运行时切换策略,仍需结合std::function或虚函数
以上就是C++如何使用模板实现策略选择模式的详细内容,更多请关注知识资源分享宝库其它相关文章!
相关标签: c++ 排列 多态 结构体 Lambda 指针 虚函数 接口 using operator 泛型 闭包 function 对象 算法 大家都在看: C++如何使用模板实现策略选择模式 C++内存模型与锁顺序死锁避免技巧 C++函数模板与非类型模板参数结合 C++如何实现类的封装与模块化设计 C++单例模式线程安全实现方法






发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。