通过map 查找 调用类的成员函数
时间:2010-12-02 来源:wumao2
在上一篇,我转载了《C++中指向类成员的指针》, 这是本篇的内容是本篇的基础。
本片文章主要是用实例说明怎样通过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
// ! main.cpp #include <QtCore/QCoreApplication>
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();
}
相关阅读 更多 +