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