Loading

适配器

仿函数

仿函数(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;
}
posted @ 2020-02-08 17:09  三只猫-  阅读(216)  评论(0编辑  收藏  举报