如果你不懂,为什么STL的很多容器构造函数或者其他什么函数,可以既接受一个函数指针,又可以接受函数对象,你应该看看下面的介绍:
从实现来说,函数对象就是一个“行为类似函数”的对象,为了能够“行为类似函数”,其类别定义中必须自定义function call运算子(operator())。仿函数是为了STL能够实现更好的抽象性。仿函数主要用于STL中,当需要传入一个函数时使用。虽然通常来说我们可以直接传入一个函数指针,但是函数指针的抽象性不够强,同时函数指针也无法跟STL中其他组件搭配使用,所以仿函数还是有比较大的意义的。在STL中有很多仿函数,我们暂时不介绍它们。下面再看看仿函数配接器。
配接器是一种设计模式,它在原有类型的基础上扩展成为另外一个接口,使原本因为接口不兼容而不能合作的类型可以一起工作。仿函数的配接操作包括bind(将二元仿函数的第一或者第二个参数固定为某个值),negate(逻辑否定,将某个一元或者二元仿函数的返回值取反),compose(组合调用,用一个函数的返回值作为另外一个的参数执行调用)以及对一般函数(辅助函数是ptr_fun)或者成员函数(辅助函数是mem_fun, mem_fun_ref)的修饰,使之成为一个仿函数。需要特别注意的是,配接器的参数是仿函数,返回值跟仿函数的返回值一致,极大可能不是仿函数,所以配接器不能组合使用:adaptor1(adaptor2)。为了配合配接器工作,每个配接器都有一个辅助函数,用于生成配接器对象。比如bind1st是binder1st的辅助函数。平时我们基本都是用辅助函数的,所以,不要以为辅助函数是配接器。