c++新加三种运算符支持成员函数指针:
::*
->*
.*
在使用成员函数指针时必须用对象去调用,否则编译错误。
1,成员函数指针的声明与定义,如:
class XX
{
public:
typedef void (XX::*funProc)(void); //成员函数指针声明
private:
std::map<std::string, funProc> m_funProcMap; //定义
};
2,成员函数指针的使用,如:
auto ite = m_funProcMap.find(command);
if(ite != m_funProcMap.end())
{
(this->*m_funProcMap[command])();
}
3,c++例子,如:
#include <map>
class CTest
{
public:
typedef void (CTest::*funProc)(void);
static CTest *instance();
void init();
void onCommand(std::string &command);
private:
void IssueCard();
void DeleteCard();
void IssueFaceImage();
void DeleteFaceImage();
void ControlDoor();
private:
std::map<std::string, funProc> m_funProcMap;
};
CTest *CTest::instance()
{
static CTest inst;
return &inst;
}
void CTest::init()
{
//map初始化
m_funProcMap.insert(std::pair<std::string, funProc>("IssueCard", &CTest::IssueCard));
m_funProcMap.insert(std::pair<std::string, funProc>("DeleteCard", &CTest::DeleteCard));
m_funProcMap.insert(std::pair<std::string, funProc>("IssueFaceImage", &CTest::IssueFaceImage));
m_funProcMap.insert(std::pair<std::string, funProc>("DeleteFaceImage", &CTest::DeleteFaceImage));
m_funProcMap.insert(std::pair<std::string, funProc>("ControlDoor", &CTest::ControlDoor));
}
void CTest::onCommand(std::string &command)
{
auto ite = m_funProcMap.find(command);
if(ite != m_funProcMap.end())
{
(this->*m_funProcMap[command])();
}
}
void CTest::IssueCard()
{
printf("call IssueCard\n");
}
void CTest::DeleteCard()
{
printf("call DeleteCard\n");
}
void CTest::IssueFaceImage()
{
printf("call IssueFaceImage\n");
}
void CTest::DeleteFaceImage()
{
printf("call DeleteFaceImage\n");
}
void CTest::ControlDoor()
{
printf("call ControlDoor\n");
}
int main()
{
std::string cmd = "IssueCard";
CTest::instance()->init();
CTest::instance()->onCommand(cmd);
return 0;
}