C++中的仿函数
仿函数是什么
仿函数(Functor)在C++中和函数对象是一个概念,它们都是重载了函数调用运算符的类的对象,Functor是STL六大模块之一,其余模块分别是Container, Algorithm, Iterator, Adaptor, Allocator.
仿函数存在的意义
仿函数的作用和C语言中的函数指针很像,但它扩展性更好。当我们需要为某种算法提供特定“操作”(比如说排序方式)时,我们可以传入函数指针,但如果将来这个函数的签名(参数个数,参数类型,参数顺序,不包括返回值类型)发生了变化,就需要做很大调整了。其次,函数之间可能会共用变量,维护全局变量也很麻烦。仿函数就没有这些缺点,它可以被依赖、组合和继承,在自己的类中维护变量,功能更加强大。
比如在用到unordered_map或者unordered_set的时候,我们可能会需要将自定义类用作key,这时我们需要做两件事
- 为这个类重载等于运算符
- 提供用于hash的仿函数
举个例子,对于下面这个磁盘页面类
1 |
|
我们需要提供一个hash函数对象,从而构建一个unordered_map,使得磁盘中的页和内存中的帧可以一一对应
1 |
|
这样我们就可以获得std::unordered_map<PageId,frame_id_t,PageIdHash>了,如果我们想要提供默认实现,可以
再使用模板特化的方法
1 |
|
有时候仿函数的存在是为了让函数具有类的性质,通过仿函数,我们可以在拥有函数功能的同时,拥有状态,依据函数生成对象,让函数能彼此继承。仿函数主要在STl中使用,lambda的内部实现也是用的仿函数。
C++中的仿函数
http://example.com/2024/04/08/C-中的仿函数/