通用函数指针调用不同类对象的同参成员函数

一段代码,通用函数指针调用不同类对象的同参成员函数。

#include <iostream>
#include <map>

class Base {
};

class A {
public:
    void f1() {std::cout << "A::f1" << std::endl;}
    void f2() {std::cout << "A::f2" << std::endl;}
};

class B {
public:
    void f1() {std::cout << "B::f1" << std::endl;}
};

typedef void (Base::*Func)();

struct Item {
    void* obj;
    Func pF;
};

class Dispatch {
public:
    void init() {
        add("A1", (void*)&m_a, (Func)(&A::f1));
        add("A2", (void*)&m_a, (Func)(&A::f2));
        add("B1", (void*)&m_b, (Func)(&B::f1));
    }
    void add(const std::string& uri, void* obj, Func pF) {
        Item im;
        im.obj = obj;
        im.pF = pF;
        m_mapItem[uri] = im;
    }
    void call(const std::string& uri) {
        std::map<std::string, Item>::iterator it = m_mapItem.find(uri);
        if(it != m_mapItem.end()) {
            Item im = it->second;
            ((Base*)im.obj->*(im.pF))();
        }
    }
private:
    std::map<std::string, Item> m_mapItem;
    A m_a;
    B m_b;
};

int main() {
    Dispatch dis;
    dis.init();
    dis.call("A1");
    dis.call("A2");
    dis.call("B1");

    return 0;
}

运行结果

[root@VM-0-7-centos mydoc]# g++ ./main.cpp 
[root@VM-0-7-centos mydoc]# ./a.out 
A::f1
A::f2
B::f1
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值