概述
1. 当想通过map(key, value)的形式来根据key调用类的函数。
2. 所调用的函数模式一样:返回值, 参数列表均完全一致
3. 唯一区别仅map的key, 以及其对应的成员函数指针。
优点:
可以实现类的成员函数多态使用
可以与服务器之类的交互,提供单一的接口,根据消息不同处理不同的响应(也算多态的特性吧)
缺点:
模式固定
只能适用一类似的函数多态
使用
假设类名为 ClassUsing
1. 类里面 using m_mapFunc = [return_type] (ClassUsing::*) ([parameterList]);
2. 里定义与1模式一样的函数(函数名不一样)
3. 类里定义map<key, m_mapFunc > m_mapFuncCall;(key, 可以用于区分map就好)
4. 初始化m_mapFuncCall: m_mapFuncCall[key] = &ClassUsing::2中的函数名
5. 使用 [return_type] [variablename] = (this->*m_mapFuncCall[key]) ([parameterList]);
实例
class ClassUsing
{
public:
ClassUsing();
void UsingFunc(const std::string &msgType, const std::string str);
public:
using classFunc = std::string (ClassUsing::*)(const std::string &str);
private:
std::string getName(const std::string &str) { return str; }
std::string getAddr(const std::string &str) { return str; }
std::string getInfo(const std::string &str) { return str; }
private:
std::map<std::string, classFunc> m_callFunc;
};
ClassUsing::ClassUsing()
{
m_callFunc["name"] = &ClassUsing::getName;
m_callFunc["addr"] = &ClassUsing::getAddr;
m_callFunc["info"] = &ClassUsing::getInfo;
}
void ClassUsing::UsingFunc(const std::string &msgType, const std::string str)
{
auto iterFunc = m_callFunc.find(msgType);
if (iterFunc != m_callFunc.end())
{
(this->*( (*iterFunc).second) )(str);
}
}