如何设计通用的回调机制

许多程序都需要一种通用的回调机制,这种回调机制不用关心它们的类类型。例如,一个调用GUI组件成员函数的事件驱动的系统中,调用之前并不知道实际的类型信息。这时可以创建一种通用的回调类模板将这种任务流程化。该模板第一个参数是其成员函数被调用的类,第二个模板参数是一个指针,指向类的成员函数。这里的关键技巧第二个参数基于(或者说依赖于)第一个参数:

template < class T, void (T::*F)() > class callback {/**/};

这个模板的实现并不复杂,有一个对 T 的引用,它是一个类,其成员函数要被调用,一个构造函数和一个叫做execute()的成员函数,由它调用回调成员函数:

template < class T, void (T::*F)() >
class callback
{
public:
callback(T& t) : object(t) {} // assign actual object to T
void execute() {(object.*F)();}// launch callback function
private:
T& object;
};

记住:为了通过成员指针调用成员函数,必须要引用或实际对象的指针。这就是为什么该模板有一个T&作为数据成员,现在假设我们要使用这个回调模板来执行类A 的一个回调函数:

class A
{
public:
void f();
};

这里是实例化该模板的方法:模板参数必须是常量表达式。因此,你不能用变量作为此成员函数的地址。而要用&操作符接受该函数的地址。最后,用模板对象作为参数传递你要调用其成员函数的对象:

int main()
{
A a; // 首先创建一个对象
callback < A, &A::f > c(a); // 实例化模板
c.execute(); // 调用回调成员函数
}

你可以将此回调类模板用于任何类类型,只要所调用的成员函数名字相同即可。

如何设计通用的回调机制相关推荐

  1. Nordic系列芯片讲解九 (BLE事件回调机制解析)

    BLE事件回调机制解析 nRF5 SDK从版本14开始,对事件回调机制做了更新,引入了观察者模式,以解耦不同BLE Layer对BLE事件的回调函数. 实现这套机制用到了Flash的段(Section ...

  2. 面试官:你知道Java中的回调机制吗?

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 来源:22j.co/cFPf          正文    调用和 ...

  3. boost源码剖析之:多重回调机制signal(下)

    boost源码剖析之:多重回调机制signal(下) 刘未鹏 C++的罗浮宫(http://blog.csdn.net/pongba) 在本文的上篇中,我们大刀阔斧的剖析了signal的架构.不过还有 ...

  4. boost源码剖析之:多重回调机制signal(上)

    boost源码剖析之:多重回调机制signal(上) 刘未鹏 C++的罗浮宫(http://blog.csdn.net/pongba) boost库固然是技术的宝库,却更是思想的宝库.大多数程序员都知 ...

  5. 深入浅出: Java回调机制(异步)

    什么是回调?今天傻傻地截了张图问了下,然后被陈大牛回答道"就一个回调-".此时千万个草泥马飞奔而过(逃 哈哈,看着源码,享受着这种回调在代码上的作用,真是美哉.不妨总结总结. 一. ...

  6. Java回调机制解析

    模块之间总是存在这一定的接口,从调用方式上看,可以分为三类:同步调用.回调和异步调用.同步调用是一种阻塞式调用,也是我们在写程序中经常使用的:回调是一种双向的调用模式,也就是说,被调用的接口被调用时也 ...

  7. Android RecyclerView设计通用Adapter

    RecylerView 的使用频率现在也算做是很高了吧?使用起来的确是挺方便的,也容易实现一些比较好看的效果 一.一般步骤 一般的设计流程都是如下所示 首先是需要一个 JavaBean 来承载数据,包 ...

  8. java filter 回调_Java 异步回调机制实例分析

    Java 异步回调机制 一.什么是回调 回调,回调.要先有调用,才有调用者和被调用者之间的回调.所以在百度百科中是这样的: 软件模块之间总是存在着一定的接口,从调用方式上,可以把他们分为三类:同步调用 ...

  9. Week 4.2 | Lecture 10 | 多态性设计通用方法、比较器 | CS61B-Spring-2018

    一.多态性 多态性:多态性的核心是"多种形式".在Java中,多态性是指对象如何具有多种形式或类型.在面向对象的编程中,多态与如何将一个对象视为其自己的类的实例,其超类的实例,其超 ...

最新文章

  1. TensorRT学习笔记(三)
  2. Pidgin Portable 使用点滴
  3. [数据库] Navicat for Oracle基本用法图文介绍
  4. libusb开发:bulk/interrupt数据传输、hotplug热插拔
  5. UI行业发展预测 系列规划的调整
  6. python地图散点图_Python中基于Basemap的三维散点图
  7. 经典面试题之 TCP三次握手 和 TCP四次挥手过程----详解
  8. CVPR 2020 | 北航提出:通过由粗到精特征自适应进行跨域目标检测,表现SOTA!
  9. SpringBoot+AOP构建多数据源的切换实践
  10. 查询linux磁盘剩余空间脚本,linux磁盘空间报警脚本
  11. ibm语音识别输入系统
  12. mysql修改密码5.7_mysql数据库5.7版修改密码详细(centos7)
  13. 企业如何建立强大的绩效管理系统
  14. 【iOS取证篇】iOS设备去除备份密码提取数据
  15. App开发 - 谈谈App架构的演进
  16. 喜马拉雅xm格式转化mp3_MTS视频格式转化
  17. 电脑打字不显示候选框问题
  18. Sklearn.cluster
  19. 国家计算机一级考试题库百度云,全国计算机一级考试题库
  20. 【Python爬虫】| XPANX获取抖音APP小视屏

热门文章

  1. 2021中国短视频和直播电商行业人才发展报告
  2. 2021住房消费品质服务报告
  3. 输入5门学科的成绩,编写程序求其平均分。要求用函数完成,科目存放在指针申请的动态空间中。
  4. linux每个版本发布时间,Ubuntu 21.04各版本的发布时间公布和计划功能介绍
  5. 管理活动目录域服务实训_2019级酒店管理专业前厅与客房服务校外课程实训总结篇...
  6. 作者:熊赟,复旦大学计算机科学技术学院副教授。
  7. 作者:刘昂(1990-),男,中国科学院计算机网络信息中心工程师
  8. 作者:王融,中国信息通信研究院互联网法律中心副主任、高级工程师。
  9. Gym-100935I Farm 计算几何 圆和矩形面积交
  10. php性能优化 --- laravel 性能优化