回调函数与钩子函数的区别,另QT中connect函数的实现,lambda的使用

19 篇文章 1 订阅
文章讨论了钩子函数和回调函数的概念,钩子函数可以通过宏或函数指针实现,而回调函数在执行时一定会被调用。Lambda表达式在C++中用于创建匿名函数,常作为回调函数使用,其捕获列表允许优化变量赋值。在QT中,lambda表达式常用于实现槽函数,connect函数要求信号和槽的参数兼容。
摘要由CSDN通过智能技术生成

在这里插入图片描述
C++/C/python中回调函数使用,涉及到类成员函数指针和this指针

1、钩子函数是回调函数的一种

广泛来说两者都是一样的
严格来说
钩子函数的函数名早已被定义好,只是函数内部需要用户在应用层来定义,

1)可以完全通过宏来实现系统是否调用该函数(底层不封闭,修改宏的参数实现是否编译某块代码,然后重编译)
2)也可以通过函数指针,通过注册函数来实现(底层可以完全封闭,编译成库,然后通过应用层调用注册函数来实现系统调用哪些钩子函数)如下为注册函数的大概原理:
C语言 - 钩子函数详解

2、回调函数

在这里插入图片描述

回调函数和钩子函数

C语言回调函数和钩子函数
这两种函数的区别,简单说,其实就是钩子函数不一定会用到,而回调函数一定会用到,因为钩子函数是要等待某种状态发生才会用到,这种状态不一定会发生,而回调函数是为了某个目的设置的,只要这个目的是必须的就一定会调用到

C语言回调函数和钩子函数

c语言回调函数_【云里雾里】回调函数与钩子函数

lambda的使用

C++编译器对lambda表达式是当一个类来处理,类里含有()里的参数成员变量
并在执行该处代码时对该成员初始化,该成员变量在寄存器里或栈里
结果就是返回类的成员函数对象(public类型的operator()函数)
lambda表达式返回的也是一个函数指针

这里我们需要先对lambda表达式的实现原理做一下说明:当我们定义一个lambda表达式后,编译器会自动生成一个匿名类,这个类里面会默认实现一个public类型的operator()函数,我们称为闭包类型。那么在运行时,这个lambda表达式就会返回一个匿名的闭包实例,它是一个右值。
参考链接:c++中lambda表达式用法

作用:
1、lambda表达式作为回调函数
2、lambda表达式[]的捕获赋值,可以节省临时变量的赋值,原理就是lambda创建了一个类,[ ]里的捕获赋值只会初始化一次,详见上述参考链接

QT中connect函数

槽函数一般都是用lambda表达式来实现
这里的lambda表达式都是作为回调函数

但是这里的lambda表达式()里的参数是不固定的,不像下列sort函数
在这里插入图片描述
在这里插入图片描述

lambda表达式()里的参数是固定的,

所以要实现将可变参数的函数传入QT中connect函数的槽函数中
形参就不仅仅是固定形参列表的函数指针了

当把信号函数和槽函数传入后,根据FunctionPointer会解析出信号槽函数的返回值、所在类和形参列表

信号的参数数量必须大于等于槽函数的参数数量,信号的参数和槽函数的参数必须得兼容(类型一致或可以转化),信号槽的返回值的类型也必须得兼容

详情参考如下文章:
QT5中的connect的实现
对于qt5的信号机制的一点参考,然后利用模板实现:在新线程执行可变函数参数的调用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值