C++ typeid 语言

· · 闲话

这是个很奇怪的的问题。但自己摸索收获了很多乐趣。

之前自己慢慢摸索研究过 typeid 语法(编译器是 g++),主要是网上似乎没有详细的教程,至少我不是很找得到。

我发现 typeid 就像一门语言,研究它的过程就像破译古代文字。

先讲一下破译工具和方法。大家可以自己尝试破译一下,乐趣多多。

  1. 生成文字:就按照这个模板来就行了,相信大家都看得懂:

    #include<type_traits>
    #include<iostream>
    //记得添加自己想要的头文件
    using namespace std;
    
    int v; //目标
    
    signed main() {
     cout<<typeid(v).name()<<endl;
     return 0;
    }
  2. 破译文字:Windows 下请下载 MSYS,Linux 和 Mac 自带。打开命令行,输入:c++filt -t 回车后,进入解码模式。输入想要的内容回车即可。

    你可以输入 St6vectorIiSaIiEE 来验证是否成功,答案是 std::vector<int, std::allocator<int> >。退出这个解码界面,ctrl+C 就可以了。

你可以先不看下面的,先自己摸索一下:为什么会这样转换?原理是什么?加入给你一个 typeid 文字,你能否自己读懂是什么意思?能否自己写出一段 typeid 文字?

下面我用语文中的实词、虚词和语法来类比。

以下是我发现的几个比较重要的点(下面的东西的中文名字都是我自己编的,感性理解一下):

有发现就有未知。除了以上提到的,现在最成谜的类型/语法是它:lambda 表达式!譬如auto v=[](int i)->int{return i;}; 可以导出 N1vMUliE_E。而通过 c++filt 转化,又得到 v::{lambda(int)#1}。我实在没猜出来 lambda 表达式转换回去的那个 #1 等等是什么意思。另外,又能不能写成 #2 呢?怎么写呢?