类成员函数作为map容器的value使用实例

在项目开发工作中,常用命令字来调用类成员函数,这是需要将类成员函数的地址放在map容器中,map容器的key值为value值,这里总结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。

posted @ 2024-05-05 22:17  谢耳朵的猫  阅读(102)  评论(0)    收藏  举报