关于函数指针续二
前篇文章解決了關(guān)于函數(shù)指針的不同類成員函數(shù)傳遞的問(wèn)題。不知道細(xì)心的朋友看見(jiàn)我上篇文章后,是否發(fā)現(xiàn)參數(shù)必須被限制為特定的參數(shù)。
原來(lái)改進(jìn)的代碼如下:
?
?
class CCallFuctionList { public:CCallFuctionList(); virtual ~CCallFuctionList(void); typedef boost::function<void()> FUNCPTR; typedef std::multimap<unsigned int, FUNCPTR> FUNCMAP; typedef std::multimap<unsigned int, FUNCPTR>::iterator FUNCMAP_ITERATOR; void CallDoRegister(); private: FUNCMAP_ITERATOR m_funcIter; int i; FUNCMAP m_funcMap; };
?
?
以FUNCPTR作為參數(shù),能傳遞的函數(shù)形式只能為void xxx(void)這種類型的。
例如:#define REGISTE_FUNC(type, func) m_FuncMap.insert(std::make_pair(type, func))?
REGISTE_FUNC(SCMD_REGISTER,?? boost::bind(&CCallFuctionList::CallDoRegister, this));?
即:既FUNCPTR參數(shù)只能接受void CallDoRegister()這種類似的類成員函數(shù)!
那么有沒(méi)有辦法可以解決不同參數(shù)類型的函數(shù)成員呢?答案當(dāng)然是有。
?
?
?
我們可以模仿MFC里面的回調(diào)函數(shù)做法。具體修改如下:
?
?
enum {voidFunV,intFunV,intunI }FuncType;union pFunc {boost::function<void()> pVoidFunV;boost::function<int()> pIntFunV;boost::function<int(int)> pVoidFunI; };class CCallFuctionList { public: #define REGISTE_FUNC(type, func) m_FuncMap.insert(std::make_pair(type, func)) CCallFuctionList(); virtual ~CCallFuctionList(void); typedef boost::function<void()> FUNCPTR; typedef std::map<unsigned int, pFunc> FUNCMAP; typedef std::map<unsigned int, pFunc>::iterator FUNCMAP_ITERATOR; void CallDoRegister();void InsertMapFunc(int ID, FUNCPTR f);void Run(int ID, FuncType fType); private: FUNCMAP_ITERATOR m_funcIter; int i; FUNCMAP m_funcMap;FuncType m_FuncType;pFunc m_pFunc; };void CCallFuctionList::InsertMapFunc(int ID, FUNCPTR f) {m_pFunc.pVoidFunV = f; REGISTE_FUNC(ID, m_pFunc); }void CCallFuctionList::Run(int ID, FuncType fType, int a = 0); {m_pFunc = m_funcMap[ID];switch(fType) { case voidFunV: (this->*m_pFunc.pVoidFunV)(void); break; case intFunV: (this->*m_pFunc.pIntFunV)(void); break; case intFunI: (this->*m_pFunc.pVoidFunI)(a); break; } }
?
?
?
?
具體調(diào)用如下:
?
class A { public:A(){m_funcList.InsertMapFunc(SCMD_REGISTER, (CCallFuctionList::FUNCPTR)boost::bind(&A::Insert, this));m_funcList.InsertMapFunc(SCMD_LOGIN, (CCallFuctionList::FUNCPTR)boost::bind(&A::InsertA, this));}void Run(){m_funcList.Run(SCMD_REGISTER, intFunI, 5);m_funcList.Run(SCMD_LOGIN, intFunv);} private:int Insert(int);int InsertA(); private:CCallFuctionList m_funcList; }
?
?
?
?
通過(guò)兩張表,一張參數(shù)類型表,一張函數(shù)指針表,來(lái)實(shí)現(xiàn)參數(shù)與函數(shù)指針的對(duì)應(yīng)。MFC具有借鑒意義。
當(dāng)然不排除有更好的方法,如果有更好的辦法,歡迎指教!
?
總結(jié)
- 上一篇: 宝塔php开启zip组建,宝塔面板如何开
- 下一篇: leetcode No.83 删除排序链