仿函数
仿函数(Functors)也叫函数对象(function objects),即一种具有函数特质的对象,这种东西在调用者可以像函数一样的被调用。
仿函数的作用
从STL所提供的各个算法往往有两个版本,版本一表现出最常用的某种运算,第二个版本表现出最泛化的演算流程,允许用户以template参数来指定所要采用的行为操作。
将该操作设计为一个所谓的仿函数(语言层面是个class),再以该仿函数产生一个对象,并以此对象作为算法的一个参数。
除了上述仿函数的思路,我们还可以将该操作设计为一个函数,再将函数指针当做一个算法的参数,但是函数指针毕竟不能满足STL对抽象性的要求,也不能满足软件积木的要求——函数指针无法和STL其他组件搭配,产生更灵活的变化。
如何实现仿函数
仿函数实际上就是一个行为类似函数的对象,所以我们需要在类别定义中自定义(改写、重载)function call运算子(operator())。有了这样的运算子后,我们就可以在仿函数对象的后面加上一对小括号,以此调用仿函数所定义的operator()。
仿函数的分类
- 按照功能划分:算术运算、关系运算、逻辑运算
- 操作数个数划分:一元、二元
例如算术类:
template<class T>
struct plus:public binary_function<T,T,T> {
T operator()(const T&x,const T&y) const
{
return x+y;
}
}
仿函数的可适配操作
当被adaptable改造的时候,adaptor可能会问这些问题,所以仿函数想要融入STL这个大家庭必须要继承了其中一个class,便自动拥有了那些型别,也就拥有了配接能力。
unary_function
unary_function是用来呈现一元函数的参数型别和返回值型别。
template<class Arg, class Result>
struct unary_function {
typedef Arg argument_type;
typedef Result result_type;
}
binary_function
binary_function用来呈现二元函数的第一参数型别,第二参数型别以及返回值型别。
template <class Arg1,class Arg2,class Result>
struct binary_function {
typedef Arg1 first_argument_type;
typedef Arg2 second_argument_type;
typedef Result result_type;
}