使用STL::map来实现函数映射调用
有时我们编写一个C++类,在处理函数调用时会使用一串字符匹配来调用相应的函数。这时我们可以使用map来实现,字符串作为KEY,函数指针作为值。
采用这种方式,在构造map时,还有调用对应函数时,可能出现一些问题。这边记录了一个例子,是本人在解决问题后所记录下来的:
先定义这个类:
class ClassName
{
....
protected:
void Fun1();
void Fun2();
void Fun3();
private: typedef void (ClassName::*fnClickMsg)(); // 注意这行 typedef string ctrlName; map<ctrlName, fnClickMsg> m_mapMsgClickHandle;
};
类函数实现:
#define FnMap_BnClick(name, pFn) m_mapMsgClickHandle.insert(map<ctrlName, fnClickMsg>::value_type((name), (&ClassName::pFn)))
ClassName::ClassName()
{
FnMap_BnClick(_T("btnFun1"), Fun1); FnMap_BnClick(_T("btnFun2"), Fun2); FnMap_BnClick(_T("btnFun3"), Fun3);
}
这时,我们已经把3个成员函数放到m_mapMsgClickHandle中了。
在函数调用时,我们可以如下进行:
void ClassName::Test(LPCTSTR lpFunName)
{
map<ctrlName, fnClickMsg>::iterator itor = m_mapMsgClickHandle.find(lpFunName); if (m_mapMsgClickHandle.end() != itor) { (this->*itor->second)(); // 注意这边的调用方式 }
}
第一处标记注意的地方,是容易出现函数指针存放到map中时,出现类型不匹配,当然,你也可以把3个函数定义为static。
第二处标记注意的地方,也是容易出错的地方。提示是:项不会计算为接受0 个参数的函数
