了解C ++中Maps和Vectors的typeid.name()输出

时间:2017-02-18 18:56:40

标签: c++ vector maps typeid

有人可以帮助更好地了解地图和向量上typeid.name()的输出吗?请在下面找到我的程序及其输出。

例如:std::map<int,int>的输出出现在TYPE is: [St3mapIiiSt4lessIiESaISt4pairIKiiEEE],我可以解析std::map当然的地图 Iii 代表int,int,但其余字符是什么意思?

程序:

#include <iostream>
#include <map>
#include <vector>
#include <typeinfo>

using namespace std ;

template <class A>
void showtype (A x)
{
        cout<<"TYPE is: ["<<typeid(x).name()<<"]\n" ;
}

int main()
{
        std::map<int,int> iM ;                  showtype(iM) ;
        std::map<int,std::string> isM ;         showtype(isM) ;
        std::map<std::string,std::string> ssM ; showtype(ssM) ;
        std::vector<std::string> sV ;           showtype(sV) ;
        std::vector<int> iV ;                   showtype(iV) ;
        return 0 ;
}

输出:

%_Host@User> ./typeid.name
TYPE is: [St3mapIiiSt4lessIiESaISt4pairIKiiEEE]
TYPE is: [St3mapIiSsSt4lessIiESaISt4pairIKiSsEEE]
TYPE is: [St3mapISsSsSt4lessISsESaISt4pairIKSsSsEEE]
TYPE is: [St6vectorISsSaISsEE]
TYPE is: [St6vectorIiSaIiEE]
%_Host@User>

1 个答案:

答案 0 :(得分:4)

您的平台使用的是Itanium ABI,特别是ABI的name mangling scheme。详细规则在链接规范中。

您的库实现选择返回由std::type_info::name修复的(重要部分)名称。这是标准不需要的幸运巧合(实际上,标准没有链接和命名重整的概念)。

GCC的ABI库包含一个在abi::__cxa_demangle中解码名称的功能(但不要在不受信任的输入上使用它,因为它充满了漏洞!)。还有一个独立的命令行工具可以在Linux上进行解码,c++filt,Linux binutils(nmobjdumpreadelf)可以解码名字也是。 (出于同样的原因,不要在不受信任的输入上运行它们。)