Use*_*d82 5 c++ maps vector typeid
typeid.name()有人可以帮助更好地理解地图和矢量的输出吗?请在下面找到我的程序及其输出。
例如:输出 for std::map<int,int>出现到TYPE is: [St3mapIiiSt4lessIiESaISt4pairIKiiEEE]我能够破译一点的地方,即映射forstd::map当然,Iii为 theint,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 ;
}
Run Code Online (Sandbox Code Playgroud)
输出:
%_Host@User> ./typeid.name
TYPE is: [St3mapIiiSt4lessIiESaISt4pairIKiiEEE]
TYPE is: [St3mapIiSsSt4lessIiESaISt4pairIKiSsEEE]
TYPE is: [St3mapISsSsSt4lessISsESaISt4pairIKSsSsEEE]
TYPE is: [St6vectorISsSaISsEE]
TYPE is: [St6vectorIiSaIiEE]
%_Host@User>
Run Code Online (Sandbox Code Playgroud)
您的平台使用 Itanium ABI,特别是 ABI 的名称修改方案。详细规则在链接规范中。
您的库实现选择返回因此从std::type_info::name. 这是一个幸运的巧合,标准没有要求(事实上,标准没有链接和名称修改的概念)。
GCC 的 ABI 库包含一个用于解析名称的函数abi::__cxa_demangle(但不要在不受信任的输入上使用它,因为它充满了漏洞!)。还有一个独立的命令行工具可以在 Linux 上进行解析,c++filt并且 Linux binutils ( nm, objdump, readelf) 也可以解析名称。(出于同样的原因,不要在不受信任的输入上运行它们。)