首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

大家来探索“类的成员函数转换成函数类” 的秘密解决思路

2012-09-17 
大家来探索“类的成员函数转换成函数类” 的秘密以下是一个把类成员函数 转换成 函数类 的简单例子;抛出心中

大家来探索“类的成员函数转换成函数类” 的秘密
以下是一个把类成员函数 转换成 函数类 的简单例子;

抛出心中疑问和答案,希望可以得到大家的讨论,大家一块学习进步。


C/C++ code
#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;}


[解决办法]
lz可以参考下 std::function
[解决办法]
http://www.codeproject.com/Articles/11015/The-Impossibly-Fast-C-Delegates

我们以前常用这个。

热点排行