使用map+函数指针代替switch和if-else的一个例子

来源:互联网 发布:奥林巴斯显微镜 知乎 编辑:程序博客网 时间:2024/06/09 23:33
很多时候我们都会遇到用switch或者if-else来进行大量判断的情况,如下面的例子
int code = 4;switch (code){   case 0:     //   break;   case 0:     //   break;   case 1:     //   break;   case 2:     //   break;   case 0:     //   break;   case 3:     //   break;   case 4:     //   break;   case 5:     //   break;// 下面还有一大堆}

这样的代码又长又臭,还好有一个简单方法可以代替,定义如下:

// 定义一个函数指针class Test;typedef void (Test::*pFun)(int code);// 一个测试类class Test{public:// 一个枚举MyCode,表示处理代码enum MyCode{code_1,code_2,code_3,code_4,code_5,code_6,code_7,};// 初始化处理编码与处理函数的对应关系voidInitHandlerMap();// 主函数voidProcess(int code);voidHandler1(int code){printf("code = %d\n",code);}voidHandler2(int code){printf("code = %d\n",code);}voidHandler3(int code){printf("code = %d\n",code);}voidHandler4(int code){printf("code = %d\n",code);}voidHandlern(int code){printf("code = %d\n",code);}private:map<int,pFun>m_pHandlerMap;};

void Test::InitHandlerMap(){m_pHandlerMap.insert(make_pair(Test::code_1,&Test::Handler1));m_pHandlerMap.insert(make_pair(Test::code_2,&Test::Handler2));m_pHandlerMap.insert(make_pair(Test::code_3,&Test::Handler3));m_pHandlerMap.insert(make_pair(Test::code_4,&Test::Handler4));}void Test::Process(int code){map<int,pFun>::iterator it;for (it = m_pHandlerMap.begin(); it != m_pHandlerMap.end(); ++it){if (it->first == code){(this->*(it->second))(code);break;}}}int main(){int code = Test::code_2;Test test;test.InitHandlerMap();test.Process(code);return 0;}






0 0
原创粉丝点击