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的信号机制的一点参考,然后利用模板实现:在新线程执行可变函数参数的调用