在C++下进行类型转换通常可以先强制转换成void*型,但是在遇到成员函数转换成全局函数的情况时却行不通,
例如如下代码:
class A {
public:
void Func() {}
};
//下面的代码无法通过编译!
//error C2440: 'type cast' : cannot convert from 'void (__thiscall A::* )(void)' to 'void *'
void* p = (void*)&A::Func;
虽然可以通过一些模板技巧构造Functor的方法可以完成,但是由于使用了模板,就不得不把实现暴露出来。
这里介绍一个特殊的方法可以在.cpp文件中实现这种类型转换。
代码如下:
void* type_convert(int first_arg , ...)
{
va_list marker;
va_start( marker, first_arg );
void *vp = (void*)va_arg( marker, int);
va_end( marker );
return vp;
}
void*p = (void*)type_convert(0, &A::Func);
其原理主要是利用C/C++对不定参数个数的函数调用的支持。
va_start( marker, first_arg ); 是根据第一个参数的地址和大小,获得后面参数列表的首地址。
va_arg( marker, int); 则是获得参数列表中的第一个参数,也就是传入的 &A::Func 。
由于C/C++对于function(...)调用方式的支持,因此编译器不会出现警告和错误,而且由于完全是采用C标准库
的函数来实现的,也不会有移植性问题。