C++的四种基本的类型转换(static_cast、dynamic_cast、const_cast、reinterpret_cast)都存在类型检查,无法直接将一种类型转换成另一种类型。最近在了解一些C++底层实现的时候,需要输出C++函数指针,但是在用qDebug()(我是Qt程序员)输出的时候被当成逻辑类型输出了。这就需要转换一下类型才能正确输出,但是用C++原本的类型转换是做不到无限制转换的,都需要类型检查。
暂不清楚C++的其它库是否提供了这种低级的无检查的类型转换方法,所以为了能够正常输出成员函数指针,我做了如下的低级强制类型转换方法。
定义一个函数模板,接收两个模板形参。一个是目标类型,一个是原始类型。
直接转换肯定是搞不定的,但是指针为我们提供了可乘之机。先对原数据取地址,通过reinterpret_cast将它转换成目标类型指针,最后解引用就得到目标类型数据了。
template用法inline T lowlevel_cast(S &&src) { return *reinterpret_cast (&src); }
我是Qt程序员,所以例子也是Qt的。
struct Func {void *func; long delta;};
Func f = lowlevel_cast(&QObject::objectName);
你可能看出来了,我在思考为什么C++成员函数指针长度会是一般指针长度(处理器位长)的两倍。



