开发中常遇到一族同类型函数的处理调用情况,开始时候简单情况就使用if / else 处理,等分支情况越来越多事,代码看起来就很长且不易维护,这种时候可以考虑使用函数指针映射来简化代码。
#include <iostream> #include <map> using namespace std; class A; typedef void (A::*Call)(string); enum MyEnum { ONE = 1, TWO, THREE, FOUR }; class A { public: explicit A() { sCallMap[ONE] = &A::fun1; sCallMap[TWO] = &A::fun2; sCallMap[THREE] = &A::fun3; } ~A(){} void caller(MyEnum e, string arg) { cout << "enum " << e; if (sCallMap.find(e) == sCallMap.end()) { cout << " callMap no key " << e; } else { (this->*sCallMap[e])(arg); } } private: void fun1(string arg) { cout << arg.c_str(); } void fun2(string arg) { cout << arg.c_str(); } void fun3(string arg) { cout << arg.c_str(); } private: static map<MyEnum, Call> sCallMap; }; map<MyEnum, Call> A::sCallMap; int main(int argc, char *argv[]) { A a; a.caller(ONE, " call func1\n"); a.caller(TWO, " call func2\n"); a.caller(THREE, " call func3\n"); a.caller(FOUR, " call func4\n"); getchar(); return 0; }