为什么成员函数指针不能转换为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位编译可能需要修改机器码和指针长度
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