有人可以帮助更好地了解地图和向量上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>
答案 0 :(得分:4)
您的平台使用的是Itanium ABI,特别是ABI的name mangling scheme。详细规则在链接规范中。
您的库实现选择返回由std::type_info::name
修复的(重要部分)名称。这是标准不需要的幸运巧合(实际上,标准没有链接和命名重整的概念)。
GCC的ABI库包含一个在abi::__cxa_demangle
中解码名称的功能(但不要在不受信任的输入上使用它,因为它充满了漏洞!)。还有一个独立的命令行工具可以在Linux上进行解码,c++filt
,Linux binutils(nm
,objdump
,readelf
)可以解码名字也是。 (出于同样的原因,不要在不受信任的输入上运行它们。)