C++中使用函数指针

最近项目上遇到这样的情况,前端发起请求,我这边需要根据请求中的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类型的,需要使用①中的方式添加映射关系。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值