文章目录
- 仿函数——思维导图
- 仿函数是什么
- 仿函数的优势
- 理解仿函数
- 仿函数的原理
- 举例
仿函数——思维导图
仿函数是什么
- 使用对象名调用operator()函数看起来像是在使用函数一样,因此便有了仿函数的称呼;
- 仿函数存在的意义是:让我们方便的调用类的成员函数;
- 它在功能上替代了C语言的函数指针
- 目前我们学的写的仿函数的存在意义就是为了:使用类的重载operator()
- 什么情况下我们会使用仿函数:我们在需要实现一个我们的独特意图时,我们会写仿函数定制一个功能;
仿函数的优势
-
使用成本低
它允许我们在传参的时候顺手设定逻辑方向,即让我们可以通过改变输入类型来间接改变目标函数内部的一些逻辑方向; -
信息密度低
仿函数体现了封装思维,把大量的修改逻辑的冗杂操作封装成一次修改类型; -
低耦合
将函数内的一些过程摘出来用一个函数实现它,将函数的部分功能模块化
理解仿函数
仿函数调用类的成员函数和我们之前学的回调操作类似;
- 回调——以对象名调函数:传对象,凭借这个对象调用成员函数;
- 仿函数——以类型名调函数:传类型、传模板参数的类型,凭借这个类型的成员函数
仿函数的底层逻辑依然是靠对象(通过传来的类型和模板参数生成一个对象)使用成员函数,仿函数的优点在于省去了我们生成对象的操作,使我们的操作更加灵活。
我们可以控制类型的比较规则
仿函数不仅可以对我们传过去的参数间的逻辑运算做出改变,还可以对目标函数识别参数这一过程也做出改变;
例如:我们可以决定它的参数到底是直接参与逻辑运算还是解引用后再参与(可能传来一个地址);
仿函数的原理
当我们使用仿函数时我们会传递一些信息,我们传递的是一个类型,该类型作为模板参数给到目标函数时,它的类型信息被抽取给了目标函数,目标函数根据这个类型信息进而实例化一个对象,后续使用该对象的对象名调用operator()等函数。
举例
A<int> a;
为什么实例化对象不能我们不止写了对象名A还要加一个类型int进去,因为我们传递的对象本身并没有把它的模板参数的类型传递过去,而目标函数本身是个类需要一个类型去定义它的模板参数类型,只有这样才能在后面实例化出一个确定的对象,所以我们要手动补充;
逻辑上简而言之,一个类型传给另一个类型,附加个模板参数类型;
实践上简而言之,实例化需要类型名、类型的模板参数类型;