c++之function和bind详解-SurfaceFlinger学习必备语法基础

背景

C++中的function和bind是为了更方便地进行函数对象的封装和调用而设计的,在SurfaceFlinger源码中也是有很多使用部分。
比如分析Vsync相关源码时候有相关回调时候

在这里插入图片描述可以看到这里的mRegistration就有个参数是 std::bind,怎么这里就可以进行回调呢?
所以基于以上背景就需要学习今天的function和bind的知识才可以很轻松的分析对。

function

文档描述:
在这里插入图片描述

总结概况:

function是一个通用的函数对象容器,可以存储任意可调用对象(函数、函数指针、成员函数、成员变量、lambda表达式,任何function对象,比如一个类,定义了operator()),并提供了一致的接口来调用这些对象。通过function,可以将一个函数或函数对象作为参数传递给其他函数或存储在容器中,大大提高了灵活性。

template <class Ret, class... Args> class function<Ret(Args...)>;

参数解释:

Ret:代表调用function的返回结果的类型

Args:代表是参数的类型。

demo展示:

1、function存储函数指针方式

#include <iostream>
#include <functional>int fl(int a)
{std::cout << "a = " << a<< std::endl;return a*2;
}int main()
{//直接可以接受函数指针的赋值std::function<int(int)> f = fl;int functionResult = f(1);std::cout<<"function result = "<<functionResult<<std::endl;int directResult   = fl(1);std::cout<<" fl result = "<<directResult<<std::endl; // 调用fl函数return 0;
}
结果如下:

在这里插入图片描述
明显可以看到这里使用function对象调用方式和直接调用方法的方式都是一样的,结果都是2

2、存储类对象
在这里插入图片描述

可以看到这里的Add类对象也是可以作为一个作为一个function对象,但是这里需要注意Add类一定要进行重载operator这个方法

3、存储成员方法
代码如下:
在这里插入图片描述可以看出这里可以直接边类的成员方法赋值给function,不过这里function的Args里面第一个参数必须要求传递类对象。
调用function时候第一个参数也是必须要是Add类的对象

4、lamada表达式情况

在这里插入图片描述可以看出lamada表达式也是可以直接赋值给function对象

5、类成员变量情况
在这里插入图片描述可以看到类成员也可以直接通过function方式获取得到正确数据。

bind

学习文档:
https://legacy.cplusplus.com/reference/functional/bind/?kw=bind
在这里插入图片描述

总结bind作用:

bind是将函数和其参数进行绑定的工具,可以将一个函数和部分参数绑定在一起,生成一个新的函数对象,这个新的函数对象可以像原函数一样进行调用,但会自动填充绑定的参数。

核心参数补充:
第一个参数 fn
一个function对象,方法指针,或者是类成员变量

第二个参数 args
所有参数的集合列表,要买具体的值,要么placeholders

返回值
就是一个function的对象,当调用时候调用的就是fn这个方法体和带上传递的参数

重点强调一下最后两个:

If fn is a pointer to member, the first argument expected by the returned function is an object of the class *fn is a member (or a reference to it, or a pointer to it).

大概意思是如果fn是一个类成员相关的,那么第一个参数就需要是这个类的引用或者指针。

demo代码:

// bind example
#include <iostream>     // std::cout
#include <functional>   // std::bind// a function: (also works with function object: std::divides<double> my_divide;)
double my_divide (double x, double y) {return x/y;}struct MyPair {double a,b;double multiply() {return a*b;}
};int main () {using namespace std::placeholders;    // adds visibility of _1, _2, _3,...// binding functions:auto fn_five = std::bind (my_divide,10,2);               // returns 10/2std::cout << fn_five() << '\n';                          // 5auto fn_half = std::bind (my_divide,_1,2);               // returns x/2std::cout << fn_half(10) << '\n';                        // 5auto fn_invert = std::bind (my_divide,_2,_1);            // returns y/xstd::cout << fn_invert(10,2) << '\n';                    // 0.2auto fn_rounding = std::bind<int> (my_divide,_1,_2);     // returns int(x/y)std::cout << fn_rounding(10,3) << '\n';                  // 3MyPair ten_two {10,2};//这里fn就是类成员方法,第一个参数就要求是这个类的对象,不过这里用的是空缺std::placeholders _1// binding members:auto bound_member_fn = std::bind (&MyPair::multiply,_1); // returns x.multiply()//这里调用时候传递了真正的对象ten_twostd::cout << bound_member_fn(ten_two) << '\n';           // 20
//这里fn就是类成员变量,第一个参数就要求是这个类的对象auto bound_member_data = std::bind (&MyPair::a,ten_two); // returns ten_two.astd::cout << bound_member_data() << '\n';                // 10return 0;
}

std::placeholders _1,_2…就代表预制第1,2、、、个参数,后续真正调用function对象时候再传递进去

实战使用结合

在这里插入图片描述可以看到这里的mRegistration构造方法第二个参数就是std::bind,即绑定方法,绑定是一个CallbackRepeater::callback的成员方法,而且有3个保留参数,即后续会传递进来的。bind后就变成了function类型对象。那么这里的Registration第二个构造参数是啥呢?

在这里插入图片描述这里的Callback实际就是地道的function对象

  using Callback =std::function<void(nsecs_t vsyncTime, nsecs_t targetWakeupTime, nsecs_t readyTime)>;

最后传递到了VSyncDispatchTimerQueueEntry中,在调用VSyncDispatchTimerQueueEntry的callback方法时候会调用上面的function类

在这里插入图片描述
本文章对应视频手把手教你学framework:
hal+perfetto+surfaceflinger
https://mp.weixin.qq.com/s/LbVLnu1udqExHVKxd74ILg
在这里插入图片描述

私聊作者+v(androidframework007)

七件套专题:在这里插入图片描述
点击这里 https://mp.weixin.qq.com/s/Qv8zjgQ0CkalKmvi8tMGaw

视频:https://www.bilibili.com/video/BV1wc41117L4/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/472136.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【机器学习笔记】7 KNN算法

距离度量 欧氏距离(Euclidean distance) 欧几里得度量&#xff08;Euclidean Metric&#xff09;&#xff08;也称欧氏距离&#xff09;是一个通常采用的距离定义&#xff0c;指在&#x1d45a;维空间中两个点之间的真实距离&#xff0c;或者向量的自然长度&#xff08;即该点…

C语言指针(初阶)

文章目录 1:内存与地址1.1内存1.2:如何理解编址 2:指针变量与地址2.1:指针变量与解引用操作符2.1.1:指针变量2.1.2:如何拆解指针类型2.1.3:解引用操作符 2.2:指针变量的大小 3:指针变量类型的意义代码1解引用修改前解引用修改后 代码2解引用修改前解引用修改后 4:const修饰指针…

算法刷题:和为s的两个数

和为s的两个数 .题目链接题目详情算法原理我的答案 . 题目链接 和为s的两个数 题目详情 算法原理 这里我们是利用单调性来使用双指针的对撞指针来解决问题 因为数组给的是有序递增的,因此我们设置两个指针left和right来解决问题,当nums[left]与nums[right]相加会有三种情况:…

写一个程序,输入数量不确定的[0,9]范围内的整数,统计每一种数字出现的次数输入-1表示结束

#include <stdio.h> int main(void) {int x;int count[10];int i;for(i0;i<10;i){//初始化数组 count[i]0;}scanf("%d",&x);while(x!-1){if( x>0 && x<9){count[x];//数组参与运算 }scanf("%d",&x);}for(i0;i<10;i){pr…

复习基础知识1

局部变量 写程序时&#xff0c;程序员经常会用到局部变量 汇编中寄存器、栈&#xff0c;可写区段、堆&#xff0c;函数的局部变量该存在哪里呢&#xff1f; 注意&#xff1a;局部变量有易失性 一旦函数返回&#xff0c;则所有局部变量会失效。 考虑到这种特性&#xff0c;人们…

同学,请实现一个扫码登录

马上要到春节了&#xff0c;小伙伴们的公司是不是已经可以申请请假调休呢&#xff1f;虽然今年刚入职没有年假(好像国家不是这么规定的&#xff0c;但也不好跟公司硬杠)&#xff0c;大小周的我已经攒了 7 天调休&#xff0c;也可以提前回家过年啦&#xff01; 即使是年底&…

悦纳自己:拥抱个人局限,开启成长之旅

悦纳自己&#xff1a;拥抱个人局限&#xff0c;开启成长之旅 在人生的旅途中&#xff0c;我们每个人都会面临无数的挑战和选择。有时我们会因为这些挑战而感到焦虑和不安&#xff0c;因为我们害怕失败&#xff0c;害怕无法达到预期的目标。然而&#xff0c;真正重要的是我们如何…

Java学习笔记------static

static 创建Javabean类 public class student {private int age;private String name;private String gender;public student() {}public student(int age, String name, String gender) {this.age age;this.name name;this.gender gender;}/*** 获取* return age*/public…

C语言—for循环(1)

for 语句在语法格式上&#xff0c;降低了提供循环结构时&#xff0c;遗忘循环三要素的几率。 for语句的应用场景&#xff1a;对循环次数预先可以获知的情况&#xff0c;如果预先无法获知次数时&#xff0c;推荐使用while语句 1.当型循环:(while) 特点&#xff1a; 先判断后执行…

【C语言期末项目-通讯录】-终级版本-可动态申请内存、可存储数据到文件(手把手详细过程,期末评分A+的项目,答辩辅助神博文,建议三连点赞收藏)

目录 ​编辑 前言&#xff1a; 1.项目功能需求分析 2.文件框架说明 3.程序主框架实现 4.创建联系人结构体类型和通讯录结构体类型 4.1创建通讯录 5.程序功能实现--封装功能函数实现不同功能 5.1通讯录初始化 5.2增加联系人 5.3显示所有联系人的信息 5.4删除指定…

基于Java springmvc+mybatis酒店信息管理系统设计和实现

基于Java springmvcmybatis酒店信息管理系统设计和实现 博主介绍&#xff1a;5年java开发经验&#xff0c;专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 超级帅帅吴 Java毕设项目精品实战案例《1000套》 欢迎点赞 收藏 ⭐留言 文末获取…

【复现】cellinx摄像设备 未授权漏洞_50

目录 一.概述 二 .漏洞影响 三.漏洞复现 1. 漏洞一&#xff1a; 四.修复建议&#xff1a; 五. 搜索语法&#xff1a; 六.免责声明 一.概述 cellinx是一家韩国的摄像设备 二 .漏洞影响 通过未授权访问可以创建用户进入后台&#xff0c;可能造成系统功能破坏。 三.漏洞复…