C++类中使用表驱动方案
来源:互联网 发布:淘宝秒杀不用刷新 编辑:程序博客网 时间:2024/05/17 22:16
表驱动是一种很不错的编程方法,合理的使用表驱动能够极大的减少代码的复杂度,消除掉大量的if else或者是switch语句,并且能够提升代码性能。
因为哈希是最快的查找算法。这儿我只是给出如何在C++ 中使用表驱动的编程方法。
假设我们正在编写一个消息协议处理程序,需要处理不同协议的消息包,那么肯定会立即想到需要根据消息头中的协议字段来区分消息类型,并
发送到对应的消息处理函数中处理。
enum MsgType{ PROTO_TCP, PROTO_UDP, PROTO_SCTP, PROTO_NULL,};class Msg{public: int type; int size;};class MsgProc{public: MsgProc(); ~MsgProc(); int Proc(enum MsgType t, Msg* m);private: int TcpProc(Msg* m); int UdpProc(Msg* m); int SctpProc(Msg* m); int ProcError(Msg* m);private: typedef int (MsgProc::*proc)(Msg* m); struct tbl { enum MsgType msg_type; proc msg_proc; }; static struct tbl m_proc[];};
这儿使用静态可变数组的方式实现,此种方法可能只是在GNU编译器上才是有效的。也可以使用map来保存,在构造函数中初始化表。但是毕竟map是红黑树实现占用的内存以及效率并没有静态数组高。再给出CPP源程序的代码片段:
#include <iostream>#include "msgproc.h"using std::cout;using std::endl;struct MsgProc::tbl MsgProc::m_proc[] = { {PROTO_TCP, &MsgProc::TcpProc}, {PROTO_UDP, &MsgProc::UdpProc}, {PROTO_SCTP, &MsgProc::SctpProc}, {PROTO_NULL, &MsgProc::ProcError},};MsgProc::MsgProc(){}MsgProc::~MsgProc(){}int MsgProc::TcpProc(Msg* m){ cout << "TcpProc:" << m->type << m->size << endl; return 0;}int MsgProc::UdpProc(Msg* m){ cout << "UdpProc:" << m->type << m->size << endl; return 0;}int MsgProc::SctpProc(Msg* m){ cout << "SctpProc:" << m->type << m->size << endl; return 0;}int MsgProc::ProcError(Msg* m){ cout << "Error:" << endl; return -1;} int MsgProc::Proc(enum MsgType t, Msg* m){ return (this->*m_proc[t].msg_proc)(m);}
需要注意的是C++中对函数地址的引用和C语言不同,在调用表驱动函数的Proc成员函数中对表驱动方法的引用方式。
0 0
- C++类中使用表驱动方案
- C++类中使用表驱动
- davinci 644X中UART1使用8250.c驱动注意
- 從DataView中生成Excel報表的方案(C#)
- 在驱动中使用链表
- 驱动中使用内核链表
- 驱动中使用资源
- Linux中Ldd使用方案
- mongodb的c驱动使用
- Oracle存储过程中使用临时表的替代方案
- Oracle存储过程中使用临时表的替代方案
- 驱动开发中,在C中使用C++的方法
- C-表驱动-代码
- Linux驱动中delayed_workqueue使用
- 驱动中使用class_device_create()…
- linux驱动中使用定时器
- 驱动中ioctl的使用
- 直流电机驱动方案一
- newLISP C++编译示范工程cppwizard v1.2.0发布
- windows下memcached安装
- 海盗分金币
- OJ刷题之《蚂蚁感冒》
- 企业级Hadoop 2.x入门系列之七YARN的Shell操作与管理
- C++类中使用表驱动方案
- 丈夫的出轨短信竟错发给我
- MySQL中TIMESTAMP类型可设置默认值为CURRENT_TIMESTAMP
- 企业级Hadoop 2.x入门系列之八HDFS和YARN的启动方式
- Java监控文件夹变化
- boundingRectWithSize:options:attributes:context:
- Iterator(1)-ArrayList
- MyEclipse8.5反编译插件安装
- Android下BroadcastReceiver应用详解