前两年开始接触boost,boost库真是博大精深;今天简单介绍一下boost中之前用到的的bind与function,感觉挺实用的,分享给大家,我对boost用的也不多,让大家见笑了。

上次文发了一个基于类成员函数指针实现的一个消息处理框架,这次用boost的function实现,比那个要简单灵活很多;

今天介绍的这个示例代码,算是一个消息处理框架吧,用于说函数对象function与bind的基本用法;

首先介绍一下function与函数指针的区别:

函数指针:只能指向静态函数,如果要指向类的成员函数就有一定的难度(也可以实现,上文中使用的成员函数指针)

function:函数对象,这个比较灵活,即可以当做函数指针用,也可以存储类的成员函数,类似于成员函数指针;

关于bind,这里使用主要是用于将成员函数转换为函数对象;

处理框架类:

//process_data.h

#include <iostream>
#include <map>
#include "public.h"
#include <boost/bind.hpp>
#include <boost/function.hpp> using namespace std; class CDataProcess; //typedef int (CDataProcess::*DataMsgAction)(void *, int); //boost bind def
typedef boost::function<int(string,const void *, int)> MsgProcFunc; class CDataProcess
{
private:
map<string,MsgProcFunc > devCmdActionMap; //用于存储消息命令字与处理函数对象 protected:
CDataProcess();
~CDataProcess();
static CDataProcess *m_instance; public:
static CDataProcess *getInstance();
int registProcHandle(string cmd, MsgProcFunc handle); //注册消息处理函数对象
int processDataFunction(string cmd, const void *pData, int iDataLen);//消息处理 };

//process_data.cpp

#include "public.h"
#include "process_data.h"
#include <stdio.h> /*****************************************************************************
Prototype : CDataProcess.CDataProcess
Description : 构造函数
Input : None
Output : None
Return Value :
History :
1.Date : 2016/1/29
Author : fens
Modification : Created function
*****************************************************************************/
CDataProcess::CDataProcess()
{
}
/*****************************************************************************
Prototype : CDataProcess.~CDataProcess
Description : 析构函数
Input : None
Output : None
Return Value :
History :
1.Date : 2016/1/29
Author : fens
Modification : Created function
*****************************************************************************/
CDataProcess::~CDataProcess()
{
}
/*****************************************************************************
Prototype : CDataProcess.registProcHandle
Description : 注册命令字处理函数对象
Input : string cmd
MsgProcFunc handle
Output : None
Return Value : int
History :
1.Date : 2016/1/29
Author : fens
Modification : Created function
*****************************************************************************/
int CDataProcess::registProcHandle(string cmd,MsgProcFunc handle)
{
map<string,MsgProcFunc>::iterator iter = devCmdActionMap.find(cmd);
if ( iter == devCmdActionMap.end() )
{
devCmdActionMap[cmd] = handle;
return 0;
}
else
{
printf("%s in %s, cmd: %s, alreay in the map\n",PRO_NAME, _FUN_, cmd.c_str());
} return 0;
}
/*****************************************************************************
Prototype : CDataProcess.processDataFunction
Description : 数据处理
Input : string cmd
const void *pData
int iDataLen
Output : None
Return Value : int
History :
1.Date : 2016/12/28
Author : fens
Modification : Created function
*****************************************************************************/
int CDataProcess::processDataFunction(string cmd, const void *pData, int iDataLen)
{
map<string,MsgProcFunc>::iterator iter = devCmdActionMap.find(cmd);
if ( iter != devCmdActionMap.end() )
{
return iter->second(cmd,pData, iDataLen);
}
else
{
printf("%s in %s, not find cmd: %s func\n",PRO_NAME, _FUN_, cmd.c_str());
} return -1;
} /*****************************************************************************
Prototype : CDataProcess.getInstance
Description : 获取一个实例
Input : None
Output : None
Return Value : CDataProcess History :
1.Date : 2016/1/29
Author : fens
Modification : Created function *****************************************************************************/
CDataProcess *CDataProcess::getInstance()
{
if (0 == m_instance)
{
m_instance = new CDataProcess();
}
return m_instance;
} CDataProcess * CDataProcess::m_instance = 0;

//main.cpp

#include <iostream>
#include <stdio.h>
#include "process_data.h" using namespace std; int printHelpInfo(string cmd, const void *pData, int dataLen)
{
cout <<"-----------------------------------"<<endl;
cout <<"help info:"<<endl;
cout <<"help: print this info."<<endl;
cout <<"ver : print this demo ver."<<endl;
cout <<"test: process test class func cmd."<<endl;
cout <<"q : exit."<<endl;
cout <<"-----------------------------------"<<endl; return 0;
} int printVer(string cmd, const void *pData, int dataLen)
{
cout <<"in printVer, ver 1.0.0"<<endl;
return 0;
} class testDataProc
{
public:
int TestDataProcFunc(string cmd, const void *pData, int dataLen)
{
cout << "in testDataProc::TestDataProcFunc, process cmd "<<cmd<<endl;
return 0;
}
}; int main(int argc, char **argv)
{
//静态函数注册
CDataProcess::getInstance()->registProcHandle("help", printHelpInfo); //注册help命令处理函数
CDataProcess::getInstance()->registProcHandle("ver", printVer); //注册版本ver命令处理函数 //测试类成员函数注册
testDataProc testProcObj; //这个是注册一个函数对象,test命令
CDataProcess::getInstance()->registProcHandle("test",boost::bind(&testDataProc::TestDataProcFunc, testProcObj, _1, _2, _3)); char cInPutBuf[256] = {0};
while ( true )
{
printf("inPut cmd>: ");
bzero(cInPutBuf, sizeof(cInPutBuf));
cin.getline(cInPutBuf,sizeof(cInPutBuf)); //读取一个命令
if (cInPutBuf[0] == 'q')
{
cout <<"Bye!"<<endl;
break;
}
CDataProcess::getInstance()->processDataFunction(cInPutBuf, NULL, 0); //处理命令
} return 0;
}

编译运行:



使用这个处理框架,可以优化程序处理结构,避免使用switch...case的冗长代码;

测试代码下载:http://download.csdn.net/download/wuquan_1230/10197636

微信订阅号:

基于boost的bind与function的一个简单示例消息处理框架的更多相关文章

  1. web 框架的本质及自定义web框架 模板渲染jinja2 mvc 和 mtv框架 Django框架的下载安装 基于Django实现的一个简单示例

    Django基础一之web框架的本质 本节目录 一 web框架的本质及自定义web框架 二 模板渲染JinJa2 三 MVC和MTV框架 四 Django的下载安装 五 基于Django实现的一个简单 ...

  2. koa2源码解读及实现一个简单的koa2框架

    阅读目录 一:封装node http server. 创建koa类构造函数. 二:构造request.response.及 context 对象. 三:中间件机制的实现. 四:错误捕获和错误处理. k ...

  3. 如何实现一个简单的MVVM框架

    接触过web开发的同学想必都接触过MVVM,业界著名的MVVM框架就有AngelaJS.今天闲来无事,决定自己实现一个简单的MVVM框架玩一玩.所谓简单,就是仅仅实现一个骨架,仅表其意,不摹其形. 分 ...

  4. 用Python写一个简单的Web框架

    一.概述 二.从demo_app开始 三.WSGI中的application 四.区分URL 五.重构 1.正则匹配URL 2.DRY 3.抽象出框架 六.参考 一.概述 在Python中,WSGI( ...

  5. 自己实现的一个简单的EF框架(反射实现)

    我实现了一个简单的EF框架,主要用于操纵数据库.实现了对数据库的基本操纵--CRUD 这是项目结构 这是一个 core 下的 DLL 写了一个数据库工厂,用于执行sql语句.调用sql语句工厂 写了一 ...

  6. Core1.1环境下,自己实现的一个简单的CRUD框架(反射实现)

    我实现了一个简单的EF框架,主要用于操纵数据库.实现了对数据库的基本操纵--CRUD 这是项目结构 这是一个 core 下的 DLL 写了一个数据库工厂,用于执行sql语句.调用sql语句工厂 写了一 ...

  7. 动手造轮子:实现一个简单的 AOP 框架

    动手造轮子:实现一个简单的 AOP 框架 Intro 最近实现了一个 AOP 框架 -- FluentAspects,API 基本稳定了,写篇文章分享一下这个 AOP 框架的设计. 整体设计 概览 I ...

  8. 动手写一个简单的Web框架(Werkzeug路由问题)

    动手写一个简单的Web框架(Werkzeug路由问题) 继承上一篇博客,实现了HelloWorld,但是这并不是一个Web框架,只是自己手写的一个程序,别人是无法通过自己定义路由和返回文本,来使用的, ...

  9. 一个简单的web框架实现

    一个简单的web框架实现 #!/usr/bin/env python # -- coding: utf-8 -- __author__ = 'EchoRep' from wsgiref.simple_ ...

随机推荐

  1. CSS 的层叠上下文是什么

    层叠上下文是 HTML 中的一个三维的概念,每个层叠上下文中都有一套元素的层叠排列顺序.页面根元素天生具有层叠上下文,所以整个页面处于一个“层叠结界”中. 层叠上下文的创建: 页面根元素:html z ...

  2. JVM 专题十五:执行引擎

    1. 执行引擎概述 1.1 执行引擎 1.2 概述 执行引擎是Java虚拟机的核心组成部分之一. 虚拟机是一个相对于“物理机”的概念,这两种机器都有代码执行能力,其区别是物理机的执行引擎是直接建立在处 ...

  3. scrapy 基础组件专题(三):爬虫中间件

    一.爬虫中间件简介 图 1-1 图 1-2 开始这一张之前需要先梳理一下这张图, 需要明白下载器中间件和爬虫中间件所在的位置 下载器中间件是在引擎(ENGINE)将请求推送给下载器(DOWNLOADE ...

  4. .net core微服务——gRPC(下)

    序 上一篇博客把grpc的概念说了个大概,介绍了proto的数据类型,基本语法,也写了个小demo,是不是没那么难? 今天要从理论到实际,写两个微服务,并利用grpc完成两者之间的通信.只是作为dem ...

  5. JMeter-一个接口的返回值作为输入传给其他接口

    背景: 在用JMeter写接口case,遇到一种情况,接口1查看列表接口,接口2查看详情接口,接口2需要传入接口1列表的第一条数据的id 解决方案: 首先放一下总体截图 具体步骤 1-新建一个Thre ...

  6. WPF在.NET 5 中的线路图

    WPF是用于构建Windows桌面应用程序的.NET Core UI框架.WPF的所属权最近已经移交给了我们的团队(Windows下开发生态系统和平台的团队).这种转变使跨UI框架(即WinUI和WP ...

  7. 阿里面试官:这些软件测试面试题都答对了,I want you!

    [ 你悄悄来,请记得带走一丝云彩 ] 测试岗必知必会 01请描述如何划分缺陷与错误严重性和优先级别? 给软件缺陷与错误划分严重性和优先级的通用原则: 1. 表示软件缺陷所造成的危害和恶劣程度. 2. ...

  8. InceptionV4

    目录 1. inception v4 2. Inception-resnet-v1 & Inception-resnet-v2 2.1 Inception-resnet-v1的组成模块 2.2 ...

  9. 手写SpringBoot自动配置及自定义注解搭配Aop,实现升级版@Value()功能

    背景 项目中为了统一管理项目的配置,比如接口地址,操作类别等信息,需要一个统一的配置管理中心,类似nacos. 我根据项目的需求写了一套分布式配置中心,测试无误后,改为单体应用并耦合到项目中.项目中使 ...

  10. spring学习(二)spring容器搭建与应用

    本文只是对spring容器进行操作 最简单的一个案例: 一.导包 使用IDEA的maven工程 1.在pom.xml中导入依赖 <?xml version="1.0" enc ...