博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
使用类的成员函数来实现回调函数
阅读量:4318 次
发布时间:2019-06-06

本文共 1700 字,大约阅读时间需要 5 分钟。

目标读者:能够理解回调函数的含义


把类的成员函数作为回调函数有三个步骤:

  1. 实现这个成员函数,
  2. 对这个函数进行绑定
  3. 将绑定好的函数指针传给调用函数。

一、添加头文件

#include 

二、typedef一个函数指针类型

这一步是为了方便地得到所需的函数指针变量

typedef std::function
Fun;//注意void与()之间是空格而不是‘,’

typedef std::function<返回类型 (参数一,参数二)> 函数指针类型名称

三、函数绑定

要想直接将一个类成员函数设置为一个回调函数,而不是使用静态成员函数,需要用到std::bind。

Fun fun = bind(&Test::callback, this,placeholders::_1,placeholders::_2);

回调函数指针类型 函数指针变量 = bind(&类::回调函数, 类指针,参数占位符);


》关于placeholders

placeholders域在这里起到占位符的作用,指明该参数是调用者在使用回调函数时传入的第几个参数。例如placeholders域下的_1、`_2分别代表调用者传入的第一个、第二个参数。

举个例子

读者可以先看完下面回调函数的代码实现后再回过来看这个例子,方便理解。

callback是一个有两个参数的回调函数。实现一个作差的功能。

void Test::callback(int a,int b){    printf("%d - %d = %d", a, b, a - b);}

绑定时,设置把传入的第2个参数传给变量a,把传入的第1个参数传给变量b。

Fun fun = bind(&Test::callback,this,placeholders::_2,placeholders::_1);

调用者在实际调用时,把值2传给变量a,把值1传给变量b。

fun(1,2);//fun(placeholder::_1, placeholder::_2);

计算结果:

2 - 1 = 1

绑定时不仅可以传入占位符,还可以直接传入变量。例如

int x = 5;Fun fun = bind(&Test::callback,this,placeholders::_2,x);
fun(1,2);

输出:

2 - 5 = -3

四、代码实例

在这个代码实例中,回调函数,绑定函数和调用函数都放在一个类里面,在实际项目中绑定函数和回调函数一般处在一个类中,而调用函数则存在于其他的类中。

#include 
#include
using namespace std;class Test{public: typedef std::function
Fun;//typedef一个函数指针 void callback(int a,int b)/*回调函数*/ { printf("%d+%d = %d",a,b,a+b); } void bind()/*绑定*/ { Fun fun = bind(&Test::callback, this,placeholders::_1,placeholders::_2); call(1, fun); } void call(int a,Fun f)/*调用者*/ { f(a,2); } };int main(){ Test test; test.bind(); return 0;}

输出结果:

1+2=3

五、参考资料:

1、 (实现回调函数的不同方式)

2、 (placeholders的用法)

转载于:https://www.cnblogs.com/tangyikejun/p/4012790.html

你可能感兴趣的文章
转自 zera php中extends和implements的区别
查看>>
Array.of使用实例
查看>>
【Luogu】P2498拯救小云公主(spfa)
查看>>
如何获取网站icon
查看>>
几种排序写法
查看>>
java 多线程的应用场景
查看>>
dell support
查看>>
转:Maven项目编译后classes文件中没有dao的xml文件以及没有resources中的配置文件的问题解决...
查看>>
MTK android 设置里 "关于手机" 信息参数修改
查看>>
单变量微积分笔记6——线性近似和二阶近似
查看>>
补几天前的读书笔记
查看>>
HDU 1829/POJ 2492 A Bug's Life
查看>>
CKplayer:视频推荐和分享插件设置
查看>>
CentOS系统将UTC时间修改为CST时间
查看>>
redis常见面试题
查看>>
导航控制器的出栈
查看>>
玩转CSS3,嗨翻WEB前端,CSS3伪类元素详解/深入浅出[原创][5+3时代]
查看>>
iOS 9音频应用播放音频之播放控制暂停停止前进后退的设置
查看>>
Delphi消息小记
查看>>
HNOI2016
查看>>