为什么成员函数指针不能转换为void*解决方法

为什么成员函数指针不能转换为void*?
void *pVoid = (void*)(&CTest::SomeFun);

error C2440: “类型转换”: 无法从“bool (__thiscall CTest::* )(void)”转换为“void *”


编译器为什么禁止这样的转换?我的环境是VC2008。上网找了一下,看到一个链接——
http://www.cnblogs.com/codingmylife/archive/2011/03/08/1976720.html

里面的楼主提到一句话:“成员函数指针与void*指针长度可能不同,不能随意转。”真的是这样么?我的理解,Win32系统里,所有的指针都是4个字节长吧?

成员函数指针不能转换为void*的真正原因是什么呢?

------解决方案--------------------
有时间去看看 c++必知必会 关于成员函数指针那个专题吧。你就知道为什么了。
------解决方案--------------------
有一个东西叫boost,function+bind库。
------解决方案--------------------
可以转换的,只是编译器限制不许你转换而已

看这个

template <typename to,typename from>
void cvt_ptr(from f,to& t)
{
union 
{
from _f;
to _t;
}ut;

ut._f = f;

t = ut._t;
}

这段代码用于winproc jmp 至成员函数处理。

win32或者wow64运行正常. 64位编译可能需要修改机器码和指针长度
C/C++ code

        LPBYTE    pAsm=(LPBYTE)VirtualAlloc(NULL,128,MEM_COMMIT,PAGE_EXECUTE_READWRITE);
        assert(pAsm);
        pAsm[0]=0xb9;
        *(LPDWORD)(pAsm+1)=(DWORD)(LPVOID)this;
        pAsm[5]=0xb8;
        cvt_ptr(&GWindow::WinProc,*(LPDWORD)(pAsm+6));
        pAsm[10]=0xff;
        pAsm[11]=0xe0;
        pWinProc=pAsm;

------解决方案--------------------
LZ既然想保存类的函数指针就要定义一个类函数指针类型

template<class T>
struct MemFunc
{
typedef void (T::*FuncType)();
T *obj;
FuncType memFunc;
unsigned int nElapse;
};

class NULLTYPE
{

};

typedef MemFunc<NULLTYPE> BaseFunc;

struct MemFuncInfo
{
BaseFunc* pFunc;
};

static UINT_PTR AddNewFunc(unsigned int nElapse, T *pObj, void (T::*memFunc)())
{
if (pObj == NULL || memFunc == NULL)
return 0;
MemFunc<T> *newCallFunc = new MemFunc<T>;
newCallFunc->memFunc = memFunc;
newCallFunc->obj = pObj;
newCallFunc->nElapse = nElapse;
MemFuncInfo baseFuncInfo;
baseFuncInfo.pFunc = (BaseFunc*)newCallFunc;//NULLTYPE类型指针让编译器通过,不然编译器无法知道是什么类型的实例化指针,编译布恩那个通过
m_callFuncList.push_back(baseFuncInfo);
return timerID;
}

static std::vector<MemFuncInfo> m_callFuncList;//不存不同类对象的函数指针


实际调用过程如下:

AddNewFunc(10, this, &CNetWork::RunOnce);//从代码层次来讲这样非常简洁了,编译器能自己推出什么T
------解决方案--------------------
http://blog.****.net/lifu119/article/details/7205188
探讨

地址是能取到的

C/C++ code
typedef bool (CTest::*FUNCPTR)(const CString&amp;);
FUNCPTR ptr = &amp;CTest::MsgBox; // ptr == 0x004ee2ce CTest有虚函数