仿函数
仿函数就是使一个类的使用看上去像是一个函数。本质就是重写类中的 $()$ 操作符,这样一个类就能像一个函数一样直接使用对象名字调用。
1 | class Cmp |
有些时候,我们在写代码时会发现,某些功能实现的代码会不断的在不同的成员函数中用到,可又不好将这些代码独立出来成为类的一个成员函数,但又很想复用这些代码。
可以写一个公共函数,不过函数用到的一些变量,就可能成为公共的全局变量。
而且为了复用这么一片代码,就要单立出一个函数,也不好维护,这时就可以用仿函数了。
写一个简单类,除了那些维护一个类的成员函数外,就只是实现一个operator()
,在类实例化时,就将要用的,非参数的元素传入类中。这样就免去了对一些公共变量全局化的维护。同时,又可以使那些代码独立出来,以便下次复用。而且,这些仿函数还可以用关联、聚合、依赖的类之间的关系,与用到他们的类组合在一起,这样有利于资源的管理(这点可能是它相对于函数最显著的优点了)。
- 仿函数比一般的函数灵活
- 仿函数有类型识别,可以作为模板参数
主要是能方便作为模板参数,可以使得编程更加灵活。仿函数必须要创建对象之后,使用对象名加()
调用。
例如 c++
库中的less<T>
1 | template<typename _Tp> |
可以使用仿函数作为模板参数,例如
1 | template <class T, class Container = vector<T>, class Cmp = less<T>> |
实际上还是一个模板类,模板类作为新的模板的参数