您的位置:首页 > 其它

使用STL::map来实现函数映射调用

2013-10-30 17:44 288 查看
有时我们编写一个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 个参数的函数
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: