在專案開發工作中,常用命令字來呼叫類成員函式,這裡總結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。