很多时候我们都会遇到用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,
};
// 初始化处理编码与处理函数的对应关系
void InitHandlerMap();
// 主函数
void Process(int code);
void Handler1(int code){printf("code = %d\n",code);}
void Handler2(int code){printf("code = %d\n",code);}
void Handler3(int code){printf("code = %d\n",code);}
void Handler4(int code){printf("code = %d\n",code);}
void Handlern(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;
}