類成員函式作為map容器的value使用例項

谢耳朵的猫發表於2024-05-05

在專案開發工作中,常用命令字來呼叫類成員函式,這裡總結2種使用方法。

方法1:map容器物件申明靜態變數,使用函式指標實現:

#include <iostream>
#include <map>

using namespace std;
class Base; // 前向申明,否則定義函式指標會失敗
using func_t = int(Base::*)(int); // 一定要申明為類成員函式的函式指標
class Base {
public:
    Base(){}
    int func_0(int var) {
        cout << "func_0:" << var << endl;
        return 0;
    }

    int func_1(int var) {
        cout << "func_1:" << var << endl;
        return 0;
    }

    void Run(int cmd) {
        auto item = m_func.find(cmd);
        if (item != m_func.end()) {
            (this->*(item->second))(cmd);  // 呼叫需要加入this指標,同時需要解引用
        }
    }

private:
    static std::map<int, func_t> m_func;
};
std::map<int, func_t> Base::m_func = { {0x0, &Base::func_0}, {0x1, &Base::func_1} }; int main() { Base obj; obj.Run(0x1); return 0; }
方法2:map容器物件申明非靜態變數,使用std::bind或者lamdba實現:
#include <iostream>
#include <map>
#include <functional>

using namespace std;
class Base {
public:
    Base(){
        m_func.emplace(0x0, std::bind(&Base::func_0, this, std::placeholders::_1));
        m_func.emplace(0x1, std::bind(&Base::func_1, this, std::placeholders::_1));
        m_func.emplace(0x2, [&](int a){ return func_2(a);});
        m_func.emplace(0x3, [&](int a){ return func_3(a);});
    }

    int func_0(int var) {
        cout << "func_0:" << var << endl;
        return 0;
    }

    int func_1(int var) {
        cout << "func_1:" << var << endl;
        return 0;
    }

    int func_2(int var) {
        cout << "func_2:" << var << endl;
        return 0;
    }

    int func_3(int var) {
        cout << "func_3:" << var << endl;
        return 0;
    }

    void Run(int cmd) {
        auto item = m_func.find(cmd);
        if (item != m_func.end()) {
            item->second(cmd);
        }
    }

private:
    std::map<int, std::function<int(int)>> m_func;
};

int main()
{
    Base obj;
    obj.Run(0x3);
    return 0;
}

個人推薦使用方法2。

相關文章