0%

仿函数

仿函数

仿函数就是使一个类的使用看上去像是一个函数。本质就是重写类中的 $()$ 操作符,这样一个类就能像一个函数一样直接使用对象名字调用。

1
2
3
4
5
6
class Cmp
{
bool operator()(const int& a, const int& b) const { return a < b; }
}
Cmp cmp;
cmp(a, b);

有些时候,我们在写代码时会发现,某些功能实现的代码会不断的在不同的成员函数中用到,可又不好将这些代码独立出来成为类的一个成员函数,但又很想复用这些代码。

可以写一个公共函数,不过函数用到的一些变量,就可能成为公共的全局变量。

而且为了复用这么一片代码,就要单立出一个函数,也不好维护,这时就可以用仿函数了。

写一个简单类,除了那些维护一个类的成员函数外,就只是实现一个operator(),在类实例化时,就将要用的,非参数的元素传入类中。这样就免去了对一些公共变量全局化的维护。同时,又可以使那些代码独立出来,以便下次复用。而且,这些仿函数还可以用关联、聚合、依赖的类之间的关系,与用到他们的类组合在一起,这样有利于资源的管理(这点可能是它相对于函数最显著的优点了)。

  • 仿函数比一般的函数灵活
  • 仿函数有类型识别,可以作为模板参数

主要是能方便作为模板参数,可以使得编程更加灵活。仿函数必须要创建对象之后,使用对象名加()调用。

例如 c++ 库中的less<T>

1
2
3
4
5
template<typename _Tp>
struct less : public binary_function<_Tp, _Tp, bool>
{
bool operator()(const _Tp& __x, const _Tp& __y) const { return __x < __y; }
};

可以使用仿函数作为模板参数,例如

1
2
3
4
template <class T, class Container = vector<T>, class Cmp = less<T>>
class Heap
{
}

实际上还是一个模板类,模板类作为新的模板的参数