基于boost的bind与function的一个简单示例消息处理框架
前两年开始接触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的一个简单示例消息处理框架的更多相关文章
- web 框架的本质及自定义web框架 模板渲染jinja2 mvc 和 mtv框架 Django框架的下载安装 基于Django实现的一个简单示例
Django基础一之web框架的本质 本节目录 一 web框架的本质及自定义web框架 二 模板渲染JinJa2 三 MVC和MTV框架 四 Django的下载安装 五 基于Django实现的一个简单 ...
- koa2源码解读及实现一个简单的koa2框架
阅读目录 一:封装node http server. 创建koa类构造函数. 二:构造request.response.及 context 对象. 三:中间件机制的实现. 四:错误捕获和错误处理. k ...
- 如何实现一个简单的MVVM框架
接触过web开发的同学想必都接触过MVVM,业界著名的MVVM框架就有AngelaJS.今天闲来无事,决定自己实现一个简单的MVVM框架玩一玩.所谓简单,就是仅仅实现一个骨架,仅表其意,不摹其形. 分 ...
- 用Python写一个简单的Web框架
一.概述 二.从demo_app开始 三.WSGI中的application 四.区分URL 五.重构 1.正则匹配URL 2.DRY 3.抽象出框架 六.参考 一.概述 在Python中,WSGI( ...
- 自己实现的一个简单的EF框架(反射实现)
我实现了一个简单的EF框架,主要用于操纵数据库.实现了对数据库的基本操纵--CRUD 这是项目结构 这是一个 core 下的 DLL 写了一个数据库工厂,用于执行sql语句.调用sql语句工厂 写了一 ...
- Core1.1环境下,自己实现的一个简单的CRUD框架(反射实现)
我实现了一个简单的EF框架,主要用于操纵数据库.实现了对数据库的基本操纵--CRUD 这是项目结构 这是一个 core 下的 DLL 写了一个数据库工厂,用于执行sql语句.调用sql语句工厂 写了一 ...
- 动手造轮子:实现一个简单的 AOP 框架
动手造轮子:实现一个简单的 AOP 框架 Intro 最近实现了一个 AOP 框架 -- FluentAspects,API 基本稳定了,写篇文章分享一下这个 AOP 框架的设计. 整体设计 概览 I ...
- 动手写一个简单的Web框架(Werkzeug路由问题)
动手写一个简单的Web框架(Werkzeug路由问题) 继承上一篇博客,实现了HelloWorld,但是这并不是一个Web框架,只是自己手写的一个程序,别人是无法通过自己定义路由和返回文本,来使用的, ...
- 一个简单的web框架实现
一个简单的web框架实现 #!/usr/bin/env python # -- coding: utf-8 -- __author__ = 'EchoRep' from wsgiref.simple_ ...
随机推荐
- React中setState 什么时候是同步的,什么时候是异步的?
class Example extends React.Component { constructor() { super(); this.state = { val: 0 }; } componen ...
- 数据可视化基础专题(十三):Matplotlib 基础(五)常用图表(三)环形图、热力图、直方图
环形图 环形图其实是另一种饼图,使用的还是上面的 pie() 这个方法,这里只需要设置一下参数 wedgeprops 即可. 例子一: import matplotlib.pyplot as plt ...
- bzoj3732Network
bzoj3732Network 题意: 给一个无向图,k个询问求节点a到节点b最长边的最小值.n,k≤15000. 题解: ”最长边的最小值“经常可以用最小生成树解决,因为生成树里的每一条边都是可取的 ...
- day8 python 列表,元组,集合,字典的操作及方法 和 深浅拷贝
2.2 list的方法 # 增 list.append() # 追加 list.insert() # 指定索引前增加 list.extend() # 迭代追加(可迭代对象,打散追加) # 删 list ...
- (3)html-webpack-plugin的作用
在内存中生成index.html页面 在前面的内容中我们已经知道了如何在内存中打包main.js并引入到页面中. 同样的,我们也可以把index.html也打包放入到内存中. 安装html-webpa ...
- Android 性能优化 ---- 内存优化
1.Android内存管理机制 1.1 Java内存分配模型 先上一张JVM将内存划分区域的图 程序计数器:存储当前线程执行目标方法执行到第几行. 栈内存:Java栈中存放的是一个个栈帧,每个栈帧对应 ...
- 使用SQL语句进行特定值排序
使用SQL语句进行查询时,对数据进行排序,排序要求为排序的一个字段中特定值为顶部呈现: select * from TableName order by case TableFieldName whe ...
- 借鉴一个比较标准的后端RESTful API
我们制定的 API 规范,使用了微服务架构所以做了一些改进,我们更偏向使用 http code 标识,不然需要自己处理成功或失败的逻辑,在 200 内再包一层显得啰嗦:并且微服务系列都不支持,Feig ...
- laravel 缓存相关常用操作
//----------设置缓存----------- //Cache::put($key,$val,$minutes); 如果$key已存在,则覆盖原有值 Cache::put('name', '张 ...
- TCP 服务器端
""" 建立tcp服务器 绑定本地服务器信息(ip地址,端口号) 进行监听 获取监听数据(监听到的客户端和地址) 使用监听到的客户端client_socket获取数据 输 ...