类成员函数作为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。

浙公网安备 33010602011771号