我如何获得变量的类型?

0x4*_*2D2 106 c++ variables typeof

在C++中,如何找到变量的类型?

Ric*_*lly 128

您可以使用typeid运算符:

#include <typeinfo>
...
cout << typeid(variable).name() << endl;
Run Code Online (Sandbox Code Playgroud)

  • @David - 所以`i`在你的编译器上意味着整数.返回的名称未由标准指定. (13认同)
  • 当我在vector <int>上使用它时,它返回St6vectorIiSaIiEE.WTF? (11认同)
  • @BobbyBrown你并不孤单!https://www.google.co.uk/webhp#safe=off&q=St6vectorIiSaIiEE (2认同)
  • typeid返回的名称是非常缩写的,特定于编译器的,并不供人类使用。您可以使用诸如c ++之类的命令行实用程序在代码中使用https://gcc.gnu.org/onlinedocs/libstdc++/manual/ext_demangling.html之类的代码对它们(实际上是术语!)进行“分解”。 filt`,或使用各种在线解密器中的任何一个,例如https://demangler.com/。 (2认同)

小智 22

对于静态断言,引入了C++ 11 decltype,它在某些场景中非常有用.

  • `decltype` 不仅仅可以用于静态断言。例如,“decltype(a) b;”将“b”声明为与“a”相同的类型。 (3认同)
  • 至少对于像我这样第一次学习该语言的人来说,如何使用此功能的简单示例将不胜感激...... (3认同)

Ami*_*mit 12

如果你有变量

int k;
Run Code Online (Sandbox Code Playgroud)

你可以使用它的类型

cout << typeid(k).name() << endl;
Run Code Online (Sandbox Code Playgroud)

请参阅SO上的以下主题:类似问题


Pon*_*gge 9

通常,想要在C++中找到变量的类型是错误的问题.它往往是你从程序语言中携带的东西,例如C或Pascal.

如果要根据类型编写不同的行为,请尝试了解例如函数重载对象继承.这在C++的第一天就没有意义,但要坚持下去.

  • 并非如此,假设您有一个 Object 类和一个 Book 子类。现在假设您有一个可以存储大量对象的盒子,但由于某种原因您想列出其中的所有书籍。检查类型要干净得多,然后必须向 Object 添加方法“type”,然后在 Book 上覆盖它以返回类似“book”的内容 (3认同)

Emi*_*lia 8

C++和Javascript之间的主要区别在于C++是一种静态类型语言,而javascript是动态的.

在动态类型语言中,变量可以包含任何内容,并且其类型由它所持有的值提供,即时.在静态类型语言中,声明了变量的类型,并且不能更改.

可以有动态调度和对象组合以及子类型(继承和虚函数)以及静态调度和超类型(通过模板CRTP),但在任何情况下,编译器都必须知道变量的类型.

如果您不知道它是什么或可能是什么,那是因为您设计了一些东西,因为该语言具有动态类型系统.

如果是这样的话,你最好重新考虑一下你的设计,因为它正在进入一个对你所使用的语言来说不自然的地方(最喜欢去高速公路上有毛毛虫,或者在有水的汽车里)


Dan*_*ong 5

我相信我有一个使用typeid()的有效用例,就像使用sizeof()一样有效。对于模板功能,我需要对基于模板变量的代码进行特殊处理,以便提供最大的功能和灵活性。

与使用多态性相比,它为每种支持的类型创建一个函数实例比使用多态性更为紧凑和可维护。即使在那种情况下,我也可以使用此技巧只编写一次函数主体:

请注意,由于代码使用模板,因此以下switch语句应静态地解析为一个代码块,从而优化了所有错误情况AFAIK。

考虑这个示例,如果T是一种类型而另一种则可能需要处理转换。我使用它进行类专业化访问硬件,其中硬件将使用myClassA或myClassB类型。如果不匹配,我需要花时间转换数据。

switch ((typeid(T)) {
  case typeid(myClassA):
    // handle that case
    break;
  case typeid(myClassB):
    // handle that case
    break;
  case typeid(uint32_t):
    // handle that case
    break;
  default:
    // handle that case
}
Run Code Online (Sandbox Code Playgroud)

  • TypeId:我无法在 Arduino 上使用 typeid()。另外 typeid() 是*运行时*检查,而不是编译时,因此它不能用于生成优化代码。 (2认同)