map与成员函数指针的使用

14 篇文章 0 订阅

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;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值