如何识别变量的类型

ama*_*el2 7 c++ types typeid gettype

如何在c ++中正确识别变量类型.我试过这个来识别一种变量:

int a = 5;
std::cout << typeid(a).name() << std::endl;
Run Code Online (Sandbox Code Playgroud)

而不是预期的输出int,它给你:

i
Run Code Online (Sandbox Code Playgroud)

我很困惑,为什么会发生这种情况..它只是给你一个你声明变量的类型的第一个字母.Int不是唯一的...也是这样的:

 char a = 'A'
 std::cout << typeid(a).name() << std::endl;
Run Code Online (Sandbox Code Playgroud)

Example Program

有一个简单的解决方法吗?任何帮助,将不胜感激!

Isa*_*aac 13

您的代码有两个问题,

首先typeid(..).name()返回一个实现定义的字符串,它可以是任何有效的字符串,它可以""为每个类型返回,它甚至可以为每个程序执行返回不同的值(虽然我相信该值在执行期间不能改变).GCC(和Clang?)返回不可读的名称,而Visual C++返回合理的名称(在这种情况下int)

其次如果类型a是多态类型,typeid(a)则返回typeid对应的动态类型a而不是用于声明的类型a,而是使用typeid(decltype(a)).

遗憾的是,没有标准的方法可以以人类可读或正确的C++语法的方式获取类型的名称.(如果你想要一种在GCC中工作的方法,请参见解析std :: type_info :: name的结果)

编辑使用Boost,您可以尝试std::cout << boost::typeindex::type_id<decltype(a)>().pretty_name() << std::endl;,请参阅获取人类可读和损坏的类型名称

  • 非多态类型的`typeid`很好 - 它只是给你关于静态类型的信息,而不评估表达式.参见例如http://en.cppreference.com/w/cpp/language/typeid. (3认同)
  • @Dsafds打败了我的错误,我的意思是`typeid(decltype(a))`,同时``typeid`和`decltype`是关键字,不是`std`命名空间的成员(即你不能在它们之前使用`::`运算符) )它不必相同,如果你只想获得一个识别类型的运行时对象,则使用`typeid`(返回的值必须是唯一的,但是`typeid(..).name的值( )`不必是) (2认同)