通过map 查找 调用类的成员函数

在上一篇,我转载了《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
#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, &LTest::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();
}

作者: wumao2   发布时间: 2010-12-02