使用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 个参数的函数
采用这种方式,在构造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 个参数的函数
相关文章推荐
- 词频统计的C++实现(使用stl--map)
- 使用unordered_map和函数指针实现类私有函数的调用
- 使用C++STL的map容器实现一种命令映射
- 使用 RMI + ZooKeeper 实现远程调用框架
- stl容器区别: vector list deque set map-底层实现
- 声明和实现使用不同类,可调用的方法不一样
- Android中WebView使用html,且实现android和JS的互相调用
- STL hash_map使用
- 一种ACM评判内核简易实现 使用C# WEB调用C++编译器的方法
- Java 缓存池(使用Map实现)
- C# 实践之 使用WCF实现远程调用
- 使用httpclient实现http接口调用实例
- 正确使用STL-MAP中Erase函数
- VC中使用ADO调用存储过程实现方法
- MyBatis之使用resultMap实现高级映射
- Map中放置类指针并实现调用
- python中的__new__方法与__init__方法区别与调用;通过使用__new__实现单例模式
- 使用select系统调用实现简单的TCP服务器
- STL中list,vector,deque,map,set区别、联系和使用场景
- 记录下最近在研究的使用AndroidStudio 实现untiy3d调用安卓内置的API接口实现刷新相册的功能