C++ operator()函数调用运算符重载作用及CLess类代码解析
代码功能说明
你给出的代码实现了一个名为CLess的仿函数(也叫函数对象):
class CLess { public: bool operator()(const T& x, const T& y)const { return x < y; } };
注:代码中使用了泛型参数
T,实际使用时通常会给这个类加上模板声明template<typename T>,以支持任意重载了<运算符的数据类型做比较。
这个类重载了函数调用运算符(),逻辑非常直接:接收两个同类型的只读引用参数x和y,返回x < y的布尔判断结果。重载()后,CLess的实例可以像普通函数一样直接传参调用,比如:
CLess<int> intLess; bool result = intLess(2, 6); // 实际调用operator(),返回true,等价于判断2<6
这类运算符重载的核心特点
重载()得到的仿函数,和普通函数、函数指针相比有几个明显优势:
- 类型安全,编译期即可完成类型检查,不会出现函数指针常见的隐式类型转换问题
- 可以自带状态,比如给仿函数加成员变量存储配置、计数信息,普通函数要实现同类效果只能依赖全局变量
- 可以作为模板参数传入,编译期就能确定调用逻辑,没有函数指针的运行时额外开销,性能更高
适用场景
你写的这个CLess本质是C++标准库中std::less的简化版本,这类比较仿函数的使用场景非常固定:
- 给STL有序容器指定排序规则:
std::set、std::map、std::priority_queue这类需要维持内部元素顺序的容器,默认就使用std::less作为比较谓词,构造升序排列的容器结构;如果需要自定义排序规则,也可以实现类似CLess的仿函数传入,比如要做降序排列就把返回值改成x > y即可。 - 给STL算法传入比较逻辑:排序、查找类算法比如
std::sort、std::lower_bound、std::stable_sort都支持传入自定义谓词判断元素大小关系,直接传入仿函数实例即可指定算法的判断规则,比写匿名lambda更适合多处复用的比较逻辑。 - 业务逻辑的比较规则封装:如果业务中有多处需要复用同一种大小判断逻辑(比如先比较用户等级、再比较用户积分的自定义小于规则),用仿函数封装后只需要维护一处代码,后续修改规则不需要散改所有调用点。
内容的提问来源于stack exchange,提问作者Vladislav
相关产品推荐
相关产品推荐

