大家来探索“类的成员函数转换成函数类” 的秘密
以下是一个把类成员函数 转换成 函数类 的简单例子;
抛出心中疑问和答案,希望可以得到大家的讨论,大家一块学习进步。
#include <iostream>// 目标为把任何类的成员函数,void T::*fun() 转换为CFun.// 这个在项目中对函数dispatch,register都很重要class CFun { void * m_obj; void * m_fun; CFun(void* obj,void* fun):m_obj(obj),m_fun(fun){} template<typename T> friend CFun make_cfun(T* obj,void (T::*F)(void));public: CFun(){}; void operator()(void) { class OBJ {}; typedef void (OBJ::*OBJFUN)(void); //这个是最关键的实现部分,是我胡乱猜想的。 //为了让m_obj可以调用m_fun,胡乱定了个类型.强转了一下,居然也可以 (((OBJ*)m_obj)->*(*(OBJFUN*)&m_fun))(); }};template<class T>CFun make_cfun(T* obj,void (T::*F)(void)){ return CFun((void*)obj,*(void**)&F);}class CTestA{public: void fooA() { std::cout << "This is CTestA." << std::endl; }};class CTestB{public: void fooB() { std::cout << "This is CTestB" << std::endl; }};int main(){ //分别把 a->fooa() 和 b->foob() 转换成了CFun.客户程序就不必再知道是谁的成员函数了。 CTestA a; CFun f1 = make_cfun(&a,&CTestA::fooA); f1(); CTestB b; CFun f2 = make_cfun(&b,&CTestB::fooB); f2(); return EXIT_SUCCESS;}