是否有编译器以可读的方式返回类型的名称(或提供该功能或工具的库)。本质上,我想要的是与您在源代码中编写的类型表达式相对应的字符串。
问问题
8669 次
4 回答
6
typeid(var).name()
就是你要找的。但是,输出因编译器而异……例如,对于isgcc
的输出,对于int
is 。这是一个小测试程序:i
unsigned
j
#include <iostream>
#include <typeinfo>
struct A { virtual ~A() { } };
struct B : A { };
class C { };
class D : public C { };
int main() {
B b;
A* ap = &b;
A& ar = b;
std::cout << "ap: " << typeid(*ap).name() << std::endl;
std::cout << "ar: " << typeid(ar).name() << std::endl;
D d;
C* cp = &d;
C& cr = d;
std::cout << "cp: " << typeid(*cp).name() << std::endl;
std::cout << "cr: " << typeid(cr).name() << std::endl;
int e;
unsigned f;
char g;
float h;
double i;
std::cout << "int:\t" << typeid(e).name() << std::endl;
std::cout << "unsigned:\t" << typeid(f).name() << std::endl;
std::cout << "char:\t" << typeid(g).name() << std::endl;
std::cout << "float:\t" << typeid(h).name() << std::endl;
std::cout << "double:\t" << typeid(i).name() << std::endl;
}
于 2012-07-29T13:19:14.940 回答
2
在搜索这个问题时,我刚刚在 boost 库中找到了我需要的东西: boost::core::demangle
就我而言,它是为了捕获异常:
try {
//...
} catch (std::exception& e) {
boost::core::scoped_demangled_name demangled(typeid(e).name());
std::cerr << "ERROR: " << demangled.get() << ": " << e.what() << std::endl;
}
于 2018-10-26T04:50:11.787 回答
0
下面是我写的一个小类,用于检查类型。如果需要,您可以添加更多类型。它无法检查数组类型、映射或任何过于先进的东西。如果需要,您可以添加更多类型,甚至可以添加您自己的自定义类型。这只是一个小样本。
此外,getType 函数正是您要寻找的。根据匹配的类型,您可以自定义输出字符串。我省略了包含部分,所以你只需要找到正确的包含文件,因为这个库是我更大的库的一部分。
/* 头文件.hpp */
class _cType
{
public:
_cType();
~_cType();
template<class T, class U>
static bool isSame(T &vl, U &vr);
template<class T>
static bool isInt(T &v);
template<class T>
static bool isUInt(T &v);
template<class T>
static bool isFloat(T &v);
template<class T>
static bool isLong(T &v);
template<class T>
static bool isDouble(T &v);
template<class T>
static bool isBool(T &v);
template<class T>
static bool isString(T &v);
template<class T>
static bool isChar(T &v);
template<class T>
static std::string getType(T &v);
};
extern _cType Type;
/* source.cpp */
_cType::_cType(){};
template<class T, class U>
bool _cType::isSame(T &vl, U &vr){
return ( typeid(vl) == typeid(vr) );
}
template<class T>
bool _cType::isInt(T &v){
return typeid(v) == typeid(int);
}
template<class T>
bool _cType::isUInt(T &v){
return typeid(v) == typeid(unsigned int);
}
template<class T>
bool _cType::isFloat(T &v){
return typeid(v) == typeid(float);
}
template<class T>
bool _cType::isLong(T &v){
return typeid(v) == typeid(long);
}
template<class T>
bool _cType::isDouble(T &v){
return typeid(v) == typeid(double);
}
template<class T>
bool _cType::isBool(T &v){
return typeid(v) == typeid(bool);
}
template<class T>
bool _cType::isString(T &v){
return typeid(v) == typeid(std::string);
}
template<class T>
bool _cType::isChar(T &v){
return typeid(v) == typeid(char);
}
template<class T>
std::string _cType::getType(T &v){
if ( typeid(v) == typeid(int) ) return "int";
else if ( typeid(v) == typeid(unsigned int) ) return "unsigned int";
else if ( typeid(v) == typeid(float) ) return "float";
else if ( typeid(v) == typeid(long) ) return "long";
else if ( typeid(v) == typeid(double) ) return "double";
else if ( typeid(v) == typeid(char) ) return "char";
else if ( typeid(v) == typeid(std::string) ) return "std::string";
else if ( typeid(v) == typeid(bool) ) return "bool";
else return std::string("User defined or unknown type: ") + typeid(v).name();
}
_cType::~_cType(){};
_cType Type;
于 2018-10-04T16:15:49.003 回答
0
要回答您的问题的字母(其他答案解决其意图),最简单的答案是 Visual C++ 提供“未修饰”(未损坏)名称作为 的输出std::type_info::name()
,同时将实际的损坏类型隐藏在编译器扩展后面std::type_info::raw_name()
;CPPReference 还提到 IBM 和 Oracle 提供了经过修饰的、人类可读的名称,但我对他们的编译器没有经验,因此我自己不能说这种说法是否准确。
于 2019-08-26T18:19:44.557 回答