介绍一种利用function和bind来实现回调的功能。

C++参考手册中对function的介绍:

std::function的实例能存储、复制及调用任何可调用的目标,包括:函数、lambda表达式、bind表达式或其他函数对象以及指向成员函数指针和指向数据成员指针,std::function包含在functional头文件中

我的理解是当你定义一个function对象时,你是为了用这个对象来存储一个函数指针,在你赋值时,函数本身并不会被调用,直到你需要时,通过调用这个function对象来实现对函数的回调。

std::bind原型为:

template< class F, class... Args >
/*unspecified*/ bind( F&& f, Args&&... args );
其主要功能是将函数对象与参数绑定并返回一个绑定后的函数对象,第一个参数f指定一个函数对象,args是不定长参数,用于将指定参数传入f对象中。其中对于无法确定的参数,需要在后续调用中设定的可以用占位符指定,std::bind包含在functional头文件中。
简单的使用说明:
void f(int n1, int n2, int n3)
{
std::cout << n1 << ' ' << n2 << ' ' << n3 << ' ' << '\n';
}
int main()
{
//生成函数对象,其中只给n1赋值,n2和n3用占位符表示。
  auto fun=std::bind(f,1,std::placeholders::_2,std::placeholders::_3);
  //bind已给n1赋值,所以这里调用在赋值100是无效的,输出为:1 4 5。
  fun(100,4,5);
}
下面说明如何使用function实现回调。

(1)定义回调函数类型

typedef std::function<void(int,const char *)>MessageFun;  //无返回值,有一个int型参数和一个const char *型参数

(2)定义函数对象

class ThreadObject

{

public:

  ThreadObject()

  {

    m_MessageEvent=NULL;

  }

  void setMessageEvent(MessageFun event)

  {

    m_MessageEvent=event;

  }

private:

  MessageFun m_MessageEvent;

  void run();

}

(3)调用函数对象

void ThreadObject::run()

{

  //执行任务

...

  //执行完毕调用函数对象通知

if(m_MessageEvent)

    m_MessageEvent(1,"Ok");

}

(4)在主线程中定义回调函数处理函数

class MainObject

{

public:

  MainObject();

private:

  ThreadObject m_thread;

  void onMessageEvent(int status,const char *msg);

}

(5)实现回调函数处理

void MainObject::onMessageEvent(int status,const char *msg)

{

  if(status==1)

    cout<<msg;

}

(6)设置回调函数

MainObject::MainObject()

{

  m_thread.setMessageEvent(std::bind(&MainObject::onMessageEvent,this,std::placeholders::_1,std::placeholders::_2));

}

利用function和bind实现回调功能的更多相关文章

  1. 2.cocos2dx 3.2在语法的差异,lambada使用表达式和function和bind使用功能

    1        打开 - 内置T32  Cocos2dx-3.2一个专案 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdG90b3R1enVvcXVhb ...

  2. Function.prototype.bind、call与apply方法简介

    前言 前段时间面试遇见一题,题目内容大概是 function Parent() { this.prop = 'parent'; } Parent.prototype.get = function() ...

  3. Function.prototype.bind、call与apply

    学习Function.prototype.bind.call与apply时,看到一篇博客,学到一些内容,但由于博客时间太久,根据官方文档对内容进行一些修正:下文为修正过内容 前言 前段时间面试遇见一题 ...

  4. C++中str1::function和bind

    在C++的TR1中(TechnologyReport)中包括一个function模板类和bind模板函数,使用它们能够实现类似函数指针的功能,但却却比函数指针更加灵活,特别是函数指向类的非静态成员函数 ...

  5. Function.prototype.bind

    解析Function.prototype.bind 简介 对于一个给定的函数,创造一个绑定对象的新函数,这个函数和之前的函数功能一样,this值是它的第一个参数,其它参数,作为新的函数的给定参数. b ...

  6. 解析Function.prototype.bind

    简介 对于一个给定的函数,创造一个绑定对象的新函数,这个函数和之前的函数功能一样,this值是它的第一个参数,其它参数,作为新的函数的给定参数. bind的作用 bind最直接的作用就是改变this的 ...

  7. 2.cocos2dx 3.2中语法的不同之处,lambada表达式的使用和function和bind函数的使用

    1        打开建好的T32  Cocos2dx-3.2的一个项目 2        设置Cocos显示窗口的位置是在AppDelegate.cpp中: 3  设置自适应窗口大小的代码是在上面的 ...

  8. Python与数据库[2] -> 关系对象映射/ORM[5] -> 利用 sqlalchemy 实现关系表查询功能

    利用 sqlalchemy 实现关系表查询功能 下面的例子将完成一个通过关系表进行查询的功能,示例中的数据表均在MySQL中建立,建立过程可以使用 SQL 命令或编写 Python 适配器完成. 示例 ...

  9. C++11 学习笔记 std::function和bind绑定器

    C++11 学习笔记 std::function和bind绑定器 一.std::function C++中的可调用对象虽然具有比较统一操作形式(除了类成员指针之外,都是后面加括号进行调用),但定义方法 ...

随机推荐

  1. bat echo 每行不同的颜色

    bat echo 每行不同的颜色 先看代码: @echo off SETLOCAL EnableDelayedExpansion for /F "tokens=1,2 delims=#&qu ...

  2. postgres高可用学习篇一:如何通过patroni如何管理3个postgres节点

    环境: CentOS Linux release 7.6.1810 (Core) 内核版本:3.10.0-957.10.1.el7.x86_64 node1:192.168.216.130 node2 ...

  3. Jmeter扩展自定义函数

    步骤1.导入lib\ext下ApacheJMeter_core.jar和ApacheJMeter_functions.jar 步骤2.新建function的类的package声明必须已".f ...

  4. Windows10 Faster R-CNN(GPU版) 运行 Demo

    上篇文章介绍了 TensorFlow 环境的搭建,这篇介绍 demo 运行 参考链接 参考链接2 1. 下载 TensorFlow object detection API 相关文件 点击跳转下载文件 ...

  5. 洛谷 P4281 [AHOI2008] 紧急集合 题解

    挺好的一道题,本身不难,就把求两个点的LCA变为求三个点两两求LCA,不重合的点才是最优解.值得一提的是,最后对答案的处理运用差分的思想:假设两点 一点深度为d1,另一点 深度为d2,它们LCA深度为 ...

  6. WinDbg常用命令系列---单步执行p*

    p (Step) p命令执行单个指令或源代码行,并可选地显示所有寄存器和标志的结果值.当子例程调用或中断发生时,它们被视为单个步骤. 用户模式: [~Thread] p[r] [= StartAddr ...

  7. [bzoj1001]狼抓兔子 最小割

    题意概述:给出一张无向图,每条边有一个权值,割掉这条边代价为它的权值,求使起点不能到达终点的最小代价. 显然能看出这是个最小割嘛,然后最小割=最大流,建图的时候特殊处理一下再跑个最大流就好了. #in ...

  8. 手把手带你部署K8s二进制集群

    集群环境准备: [etcd集群证书生成] #mkdir -p k8s/{k8s-cert,etcd-cert}#cd k8s/etcd-cert/ #cat > ca-config.json & ...

  9. Js 之正则验证手机号、QQ、身份证等

    // 常见的 正则表达式 校验 // QQ号.手机号.Email.是否是数字.去掉前后空格.是否存在中文.邮编.身份证.URL.日期格式.IP let myRegExp = { // 检查字符串是否为 ...

  10. Freemarker的简单demo

    第一步.导入依赖 <dependency> <groupId>org.freemarker</groupId> <artifactId>freemark ...