做了个函数指针强制转换的试验,试验通过 #include "stdafx.h" #include <map> #include <algorithm> class CTx; typedef void (CTx::*pFunc1)(void); typedef void (CTx::*pFunc2)(int); typedef std::map<char*, pFunc1> MyMap; class CTx { public: CTx(){} ~CTx(){} static void dispatch(char* szCmd, int sig, int cookie, CTx* pObj) { //应做更多安全检查,防止堆栈错误 MyMap::iterator _it; for (_it = m_map.begin(); _it != m_map.end(); ++_it) { if (!strcmp(szCmd, _it->first)) break; } if (_it != m_map.end()) { pFunc1 p= (_it->second); if (sig == 0) { (pObj->*p)(); } else if(sig == 1) { (pObj->*((pFunc2)p))(cookie); } else printf("hm, something wrong/n"); } return; } static void resister(char* szCmd, pFunc1 pF) { m_map[szCmd] = pF; } static MyMap m_map; }; MyMap CTx::m_map; class CTx1 : public CTx { public: CTx1(){} ~CTx1(){} void f1(){printf("hello, world/n");} void f2(int k){printf("hello, %d/n", k);} }; class CTx2 : public CTx { public: CTx2(){} ~CTx2(){} void f1(){printf("wula/n");} void f2(int k){printf("wula, %d/n", k);} }; int main(int argc, char* argv[]) { printf("say something!/n"); CTx1 x1; CTx2 x2; x1.resister("1_1", (pFunc1)(&CTx1::f1)); x1.resister("1_2", (pFunc1)(&CTx1::f2)); x2.resister("2_1", (pFunc1)(&CTx2::f1)); x2.resister("2_2", (pFunc1)(&CTx2::f2)); CTx::dispatch("1_1", 0, 0, &x1); CTx::dispatch("2_2", 1, 3, &x2); return 0; } 输出: say something! hello, world wula, 3