基于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);//消息处理
};

image.gif

//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;

image.gif

//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;
}

image.gif

编译运行:

image.gif编辑

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

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




 


目录
相关文章
|
6月前
|
存储 编译器 C语言
从C语言到C++_34(C++11_下)可变参数+ lambda+function+bind+笔试题(下)
从C语言到C++_34(C++11_下)可变参数+ lambda+function+bind+笔试题
94 5
|
1月前
|
C++ 容器
函数对象包装器function和bind机制
函数对象包装器function和bind机制
18 0
|
3月前
|
API C++ Python
【Azure Function】示例运行 python durable function(model V2)
【Azure Function】示例运行 python durable function(model V2)
|
4月前
|
C++ 运维
开发与运维函数问题之使用std::function实现回调函数的示例如何解决
开发与运维函数问题之使用std::function实现回调函数的示例如何解决
38 7
|
6月前
|
算法 编译器 C语言
从C语言到C++_34(C++11_下)可变参数+ lambda+function+bind+笔试题(中)
从C语言到C++_34(C++11_下)可变参数+ lambda+function+bind+笔试题
58 2
|
6月前
|
算法 编译器 C语言
从C语言到C++_34(C++11_下)可变参数+ lambda+function+bind+笔试题(上)
从C语言到C++_34(C++11_下)可变参数+ lambda+function+bind+笔试题
41 1
|
6月前
|
存储 算法 对象存储
【C++入门到精通】function包装器 | bind() 函数 C++11 [ C++入门 ]
【C++入门到精通】function包装器 | bind() 函数 C++11 [ C++入门 ]
89 1
|
6月前
|
存储 JavaScript 前端开发
js开发:请解释什么是回调函数(callback function),并给出一个示例。
回调函数是JavaScript中处理异步编程的一种常见模式,常用于事件驱动和I/O操作。它们作为参数传递给其他函数,在特定条件满足或任务完成后被调用。例如,`asyncOperation`函数接受回调函数`handleResult`,在模拟的异步操作完成后,调用`handleResult`并传递结果。这使得程序员能在操作完成后执行后续任务。
77 1
|
6月前
|
存储 安全 编译器
【C++ 包装器类 std::function 和 函数适配器 std::bind】 C++11 全面的std::function和std::bind的入门使用教程
【C++ 包装器类 std::function 和 函数适配器 std::bind】 C++11 全面的std::function和std::bind的入门使用教程
101 0
|
6月前
C++11实用技术(二)std::function和bind绑定器
C++11实用技术(二)std::function和bind绑定器
71 0

热门文章

最新文章