最近项目上遇到这样的情况,前端发起请求,我这边需要根据请求中的URL判断调用哪个函数方法,由于请求方法时字符串,于是乎,一堆if-else就出来了,如下所示:
if(uri==“abc”){
//do something
}
else if(uri=="bcd"){
//do something
}
//....
说实话,如果请求的类型少这个if-else结构都还好,不是很多,但是有几十上百个请求的时候,这个if-else就有点吓人了。
能不能让字符串和函数映射起来?答案是可以的,存放在一个map里面就可以了,下面介绍在Qt中的用法
①非类的成员函数
定义:
typedef void (*QFuncPointer)(const QString&);
QMap<QString,QFuncPointer> funcPointer;
初始化:
funcPointer.insert("ABC",(&OnABCReq));
funcPointer.insert("BCD",(*OnBCDReq));
使用:
QFuncPointer RefFunction=funcPointer["ABC"];
if(RefFunction){
RefFunction(message); //这里的message是需要传递的字符串
}
完整测试代码:
#include <QMap>
#include <QString>
#include <QDebug>
#include <QCoreApplication>
typedef void (*QFuncPointer)(const QString&);
void OnABCReq(const QString& message)
{
qDebug()<<message;
}
void OnBCDReq(const QString& message)
{
qDebug()<<message;
}
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
//定义
QMap<QString,QFuncPointer> funcPointer;
//初始化
funcPointer.insert("ABC",(&OnABCReq));
funcPointer.insert("BCD",(*OnBCDReq));
//调用
QString request="ABC",message="I am ABC";
QFuncPointer RefFunction=funcPointer["ABC"];
if(RefFunction){
RefFunction(message);
}
return a.exec();
}
①类的成员函数
定义:
//在类中定义
typedef void (类名::*QFuncPointer)(const QString&);
QMap<QString,QFuncPointer> funcPointer;
初始化:
funcPointer.insert("ABC",(&类名::OnABCReq));
funcPointer.insert("ABC",(&类名::OnBCDReq));
调用:
QFuncPointer RefFunction=funcPointer["ABC"];
if(RefFunction){
(this->*RefFunction)(message); //这里的message是需要传递的字符串
}
完整测试案例:
#include <QMap>
#include <QString>
#include <QDebug>
#include <QCoreApplication>
class Test
{
private:
//定义
typedef void (Test::*QFuncPointer)(const QString&);
QMap<QString,QFuncPointer> funcPointer;
public:
Test(){
funcPointer.insert("ABC",&Test::OnABCReq);
funcPointer.insert("BCD",&Test::OnBCDReq);
}
public:
//调用
void Request(QString& req,QString& msg);
private:
//成员函数
void OnABCReq(const QString& message);
void OnBCDReq(const QString& message);
};
void Test::Request(QString& req,QString& msg)
{
QFuncPointer RefFunction=funcPointer[req];
if(RefFunction){
(this->*RefFunction)(msg); //这里的message是需要传递的字符串
}
}
void Test::OnABCReq(const QString& message)
{
qDebug()<<message;
}
void Test::OnBCDReq(const QString& message)
{
qDebug()<<message;
}
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
Test test;
QString request="ABC",message="I am ABC";
test.Request(request,message);
return a.exec();
}
其中如果类的成员函数是static类型的,需要使用①中的方式添加映射关系。