博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
std::function与回调类
阅读量:4297 次
发布时间:2019-05-27

本文共 2328 字,大约阅读时间需要 7 分钟。

std::function是c++11中提供的Callable类,所以本篇文章中整理了function的使用方式,及以function为基础封装回调类。

1. function的使用

#include 
#include
#include
int add(int a, int b){ return a + b;}class EchoMessage{public: void echoMessage(const string& msg) { std::cout << msg << std::endl; }}void test(){ // 普通函数绑定 function
f_add = &add; int sum = f_add(1, 2); // 对象成员函数绑定,注意收个函数为类对象引用或指针; function
f_echo = &EchoMessage::echoMessage; EchoMessage em; f_echo(em, "Hello"); // 参数绑定 function
f_echo1 = bind(&EchoMessage::echoMessage, em, placeholders::_1); f_echo1("Hello");}

2. 基于function的回调类

通过将对象指针及成员函数指针保存在回调类型的成员中,在执行某个执行流中调用执行成员函数函数,即可实现函数的回调。依据上述思路,参考muduo库中的实现,对回调类的封装如下。注意执行回到函数的返回值为void。

#include 
#include
#include
using namespace std;template
class WeakCallback{public: // 将类指针,作为首个参数,构造function回调; using callable = function
; // 入参弱指针类型,从外部接管对象,其生命周期与WeakCallback对象的声明周期一致 WeakCallback(const weak_ptr
& ptr_obj, const callable& cb) : ptr_obj_(ptr_obj), cb_(cb) { } // 重载括号操作符 void operator()(Args&&... args) { // 此处必须转换为shared_ptr,否则会导致弱指针退出作用域而被析构 shared_ptr
ptr_obj(ptr_obj_.lock()); if(ptr_obj) { cb_(ptr_obj.get(), std::forward
(args)...); } }private: weak_ptr
ptr_obj_; callable cb_;};template
WeakCallback
makeWeakCallback(const shared_ptr
& object, void (CLASS::*mem_func)(ARGS...)){ return WeakCallback
(object, mem_func);}// 测试代码struct Foo{public: Foo(int num) : num_(num) {} void printAdd(int a) { std::cout << "==printAdd: " << (num_ + a) << std::endl; }private: int num_;};int main(){ shared_ptr
ptr_foo(new Foo(5)); auto wcb = makeWeakCallback(ptr_foo, &Foo::printAdd); wcb(5); return 0;}

上述代码的最主要功能就是实现第一个回调对象与对象成员函数在调用时的绑定,因c++本身支持参数绑定功能,所以可以有如下实现方式:

template 
using BindedWeakCallback = function
;template
BindedWeakCallback
makeWeakCallbackWithBind(const shared_ptr
& object, void (CLASS::*mem_func)(ARGS...)){ return bind(mem_func, object.get(), placeholders::_1);}int main(){ shared_ptr
ptr_foo(new Foo(5)); auto wcb = makeWeakCallbackWithBind(ptr_foo, &Foo::printAdd); wcb(5); return 0;}

转载地址:http://escws.baihongyu.com/

你可能感兴趣的文章
PCB设计技巧与注意事项
查看>>
linux进程之间通讯常用信号
查看>>
main函数带参数
查看>>
PCB布线技巧
查看>>
关于PCB设计中过孔能否打在焊盘上的两种观点
查看>>
PCB反推理念
查看>>
京东技术架构(一)构建亿级前端读服务
查看>>
git 提示:error: unable to rewind rpc post data - try increasing http.postBuffer
查看>>
php 解决json_encode中文UNICODE转码问题
查看>>
LNMP 安装 thinkcmf提示404not found
查看>>
PHP empty、isset、innull的区别
查看>>
apache+nginx 实现动静分离
查看>>
通过Navicat远程连接MySQL配置
查看>>
phpstorm开发工具的设置用法
查看>>
Linux 系统挂载数据盘
查看>>
Git基础(三)--常见错误及解决方案
查看>>
Git(四) - 分支管理
查看>>
PHP Curl发送数据
查看>>
HTTP协议
查看>>
HTTPS
查看>>