利用function和bind实现回调功能
介绍一种利用function和bind来实现回调的功能。
C++参考手册中对function的介绍:
std::function的实例能存储、复制及调用任何可调用的目标,包括:函数、lambda表达式、bind表达式或其他函数对象以及指向成员函数指针和指向数据成员指针,std::function包含在functional头文件中。
我的理解是当你定义一个function对象时,你是为了用这个对象来存储一个函数指针,在你赋值时,函数本身并不会被调用,直到你需要时,通过调用这个function对象来实现对函数的回调。
std::bind原型为:
/*unspecified*/ bind( F&& f, Args&&... args );
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实现回调功能的更多相关文章
- 2.cocos2dx 3.2在语法的差异,lambada使用表达式和function和bind使用功能
1 打开 - 内置T32 Cocos2dx-3.2一个专案 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdG90b3R1enVvcXVhb ...
- Function.prototype.bind、call与apply方法简介
前言 前段时间面试遇见一题,题目内容大概是 function Parent() { this.prop = 'parent'; } Parent.prototype.get = function() ...
- Function.prototype.bind、call与apply
学习Function.prototype.bind.call与apply时,看到一篇博客,学到一些内容,但由于博客时间太久,根据官方文档对内容进行一些修正:下文为修正过内容 前言 前段时间面试遇见一题 ...
- C++中str1::function和bind
在C++的TR1中(TechnologyReport)中包括一个function模板类和bind模板函数,使用它们能够实现类似函数指针的功能,但却却比函数指针更加灵活,特别是函数指向类的非静态成员函数 ...
- Function.prototype.bind
解析Function.prototype.bind 简介 对于一个给定的函数,创造一个绑定对象的新函数,这个函数和之前的函数功能一样,this值是它的第一个参数,其它参数,作为新的函数的给定参数. b ...
- 解析Function.prototype.bind
简介 对于一个给定的函数,创造一个绑定对象的新函数,这个函数和之前的函数功能一样,this值是它的第一个参数,其它参数,作为新的函数的给定参数. bind的作用 bind最直接的作用就是改变this的 ...
- 2.cocos2dx 3.2中语法的不同之处,lambada表达式的使用和function和bind函数的使用
1 打开建好的T32 Cocos2dx-3.2的一个项目 2 设置Cocos显示窗口的位置是在AppDelegate.cpp中: 3 设置自适应窗口大小的代码是在上面的 ...
- Python与数据库[2] -> 关系对象映射/ORM[5] -> 利用 sqlalchemy 实现关系表查询功能
利用 sqlalchemy 实现关系表查询功能 下面的例子将完成一个通过关系表进行查询的功能,示例中的数据表均在MySQL中建立,建立过程可以使用 SQL 命令或编写 Python 适配器完成. 示例 ...
- C++11 学习笔记 std::function和bind绑定器
C++11 学习笔记 std::function和bind绑定器 一.std::function C++中的可调用对象虽然具有比较统一操作形式(除了类成员指针之外,都是后面加括号进行调用),但定义方法 ...
随机推荐
- [转] C++ explicit关键字详解
本文转自tiankong19999 首先, C++中的explicit关键字只能用于修饰只有一个参数的类构造函数, 它的作用是表明该构造函数是显示的, 而非隐式的, 跟它相对应的另一个关键字是impl ...
- word2vec中的subsampling
http://d0evi1.com/word2vec-subsampling/ 为了度量这种罕见词与高频词间存在不平衡现象,我们使用一个简单的subsampling方法:训练集中的每个词wiwi,以下 ...
- eclipse正常启动,debug无法启动,解决办法
- 深度学习Keras框架笔记之TimeDistributedDense类
深度学习Keras框架笔记之TimeDistributedDense类使用方法笔记 例: keras.layers.core.TimeDistributedDense(output_dim,init= ...
- c#中的new和override的实例
using System; using System.Collections.Generic; using System.Linq; using System.Text; /* 简单说,抽象方法是需要 ...
- MyBatis框架的搭建
前言:MyBatis框架的前身是iBatis,本身是Apache的一个开源项目. MyBatis框架是一个半自动的orm映射框架,是实体类和sql语句之间建立映射关系,sql语句写在单独的配置文件中, ...
- Python 06 Geany的基本使用2
原文:https://www.cnblogs.com/denny402/p/5096001.html 功能:打开图片 1.下载库 pip install matplotlib 2.编写代码,将代码粘贴 ...
- $(window).load()方法的使用场景
一.$(window).load().window.onload=function(){}和$(document).ready()方法的区别 1.$(window).load() 和window.on ...
- 将爬取的实习僧网站数据传入HDFS
一.引言: 作为一名大三的学生,找实习对于我们而言是迫在眉睫的.实习作为迈入工作的第一步,它的重要性不言而喻,一份好的实习很大程度上决定了我们以后的职业规划. 那么,一份好的实习应该考量哪些因素呢? ...
- Remind Me
创建2d人物:live2d 创建3d人物:adobe fuse