一、获取类型名称
在前面的反射中,可以通过一些技术手段来实现获取类型的名称。这么一个看似简单的功能,其实实现起来并没有想象的那么简单。在一些框架中,包含了类似的功能,而主流的编译器则支持的各有不同。这不是说这种接口有多么难,而各个编译器可能有自己的实际的出发点或者说应用点,所以才没有做到完全与开发者想象的相同。
编译器厂商的不同造成的结果有点类似于世界上的同语种但不同语言的民族一样,明明大家都明白那个意思,但就是呈现出来不一样。
二、库的支持
在前面也提到过,有一种标准库提到的运算符即typeid(type or expression),它包含在头文件中 中。此处不重点讲解这个运算符的应用,只是提醒大家,这个运算符在不同的编译平台上,产生的结果是不尽相同的,这个就比较麻烦了。可以试着在不同的平台编译一下以下的代码:
auto iname = typeid(int).name();
在常见的VC编译器和g++编译器中得到结果是:
//vc
iname :int
//g++
iname:i
包括在Clang中,也和g++一样产生类似的效果。那么有没一种方法,让二者产生一种更接近于人们的普遍认知的结果呢?肯定有。其实也很好理解,这是处理C++编译器的重命名的问题,也就是人们常说的mangle和demangle现象。那么在gcc中提供了:
#ifdef __cplusplus
namespace __cxxabiv1
{
extern "C"
{
#endif
char* __cxa_demangle(const char* __mangled_name, char* __output_buffer,