1、背景
对于if-else语句或者switch-case语句非常累赘,且每个分支结构基本一致情况下,可以使用列表方式代替if-else或者switch-case;
对于C语言这方面很容易实现,但是对于C++的类成员来说需要特殊的要求。
2、代码实现
class Test : public QObject
{
typedef struct
{
QString cmd;
void (Test:: *pFunc)(int cmd);
}TestCMD;
Q_OBJECT
public:
explicit Test(QObject *parent = nullptr);
~Test();
void DealCmd(int cmd)
{
foreach(TestCMD test_cmd, m_ProtocolList)
{
if(cmd == test_cmd.cmd)
{
(this->*test_cmd.pFunc)(cmd);
break;
}
}
}
private:
void testFun01(int cmd);
void testFun02(int cmd);
private:
const QList<TestCMD> m_ProtocolList=
{
{"0xF1", &Test::testFun01},
{"0xF2", &Test::testFun02},
};
};
关键在于:
(this->*test_cmd.pFunc)(cmd);
3、基本原理
类中的每一个函数的地址(如:test_cmd.pFunc)只是一个偏移地址,而this指针是该类对象的基地址,函数执行需要根据基地址+偏移地址