本片文章主要是用实例说明怎样通过map来调用类的成员函数。
场景: 比如说我想通过输入不同的 字符串 然后调用不同的函数来处理。 我想这类应用非常多吧。 而却大部分c++程序员的解决方案是
string stInput;
if (stInput == "aaa")
{
{
// call A function, do something.
}
else if (stInput == "bbb")
{
/ call B function, do something.
}
我们可以看出这样的代码有多丑。今天我们通过map的映射调用函数。
我们可以看一下这样的结构
class A
{
public:
...
public:
typedef int (A::*pFun_t)(int x);
map<string, pFun_t> m_map2Func;
};
这样我们就可以直接通过 key 找到需要调用的成员函数。 是不是很过瘾。
//=====例子, 我这里使用的是 qt 编写的测试程序,需要的可以修改成纯c++的代码======
我的文件和类命名都是用L开头的, 因为L是我们公司的第一个字母。
// ! head file
#ifndef LTEST_H
#define LTEST_H
#include <iostream>
#include <QMap>
using namespace std;
class LTest
{
public:
LTest();
public:
int HelloWorld(int v) // v means value
{
cout << "IN helloWorld! a= " << v << endl;
return 1;
}
public:
typedef int (LTest::*pFunc)(int v);
QMap<int, pFunc > m_key2FunPtr;
};
#endif // LTEST_H
// ================ cpp file ==============
#include "ltest.h"
LTest::LTest()
{
m_Func.insert(5, <est::HelloWorld);
}
// ! main.cpp
#include <QtCore/QCoreApplication>
#include "ltest.h"
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
LTest test;
// ! 直接通过key 调用函数, 激动吧。
(test.*(test.m_Func[5]))(6); // ! 新手如果看不懂这句,可以分两边来,见下面的方法.
// ! ==== 这三句是写给新手看的,免得一下转不过弯。 和上面一句是同样的意思
typedef int (LTest::*fp)(int);
fp p = test.m_Func[5];;
(test.*p)(1000);
//===============================
return a.exec();
}