介绍一种利用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));

}

最新文章

  1. SuperMap iServer Ubuntu 开机自启动脚本
  2. 集合迭代器快速失败行为及CopyOnWriteArrayList
  3. [LintCode] Simplify Path 简化路径
  4. C#编程之委托与事件四(一)【转】
  5. jQuery 简单过滤选择器
  6. 洛谷P1136 迎接仪式
  7. poj 算法 分类
  8. BC之Run
  9. laravel homestead vagrant box安装使用,问题,及相关命令
  10. debian7 编译qtopia错误解决案例
  11. URAL 1780 G - Gray Code 找规律
  12. Android - 用Fragments实现动态UI - 和其他Fragments通信
  13. pycharm安装激活
  14. np.array转换为list,嵌套的python list转成一个一维的python list
  15. MSIL实用指南-加载bool、sbyte、byte、char、short等值
  16. gzy的摄影梦
  17. Linux下进程的创建过程分析(_do_fork do_fork详解)--Linux进程的管理与调度(八)
  18. 《maven in action》部分知识点总结
  19. JavaWeb基础之Servlet简单实现用户登陆
  20. ios程序中存储的回忆

热门文章

  1. Linux TTY介绍
  2. sql null+字符=null
  3. 《团队作业第三、四周》五阿哥小组Scrum 冲刺阶段---Day3
  4. 20-ESP8266 SDK开发基础入门篇--C# TCP客户端编写 , 加入数据通信
  5. 漏斗分析(Funnel Analysis)
  6. 微信小程序敏捷开发实战
  7. GoCN每日新闻(2019-10-23)
  8. go语言new和make
  9. hexo绑定个人域名
  10. mysql 唯一键