一段代码,通用函数指针调用不同类对象的同参成员函数。
#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