使用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 个参数的函数

经验分享 程序员 微信小程序 职场和发展