Ric*_*lly 128
您可以使用typeid运算符:
#include <typeinfo>
...
cout << typeid(variable).name() << endl;
Run Code Online (Sandbox Code Playgroud)
小智 22
对于静态断言,引入了C++ 11 decltype,它在某些场景中非常有用.
Ami*_*mit 12
如果你有变量
int k;
Run Code Online (Sandbox Code Playgroud)
你可以使用它的类型
cout << typeid(k).name() << endl;
Run Code Online (Sandbox Code Playgroud)
请参阅SO上的以下主题:类似问题
C++和Javascript之间的主要区别在于C++是一种静态类型语言,而javascript是动态的.
在动态类型语言中,变量可以包含任何内容,并且其类型由它所持有的值提供,即时.在静态类型语言中,声明了变量的类型,并且不能更改.
可以有动态调度和对象组合以及子类型(继承和虚函数)以及静态调度和超类型(通过模板CRTP),但在任何情况下,编译器都必须知道变量的类型.
如果您不知道它是什么或可能是什么,那是因为您设计了一些东西,因为该语言具有动态类型系统.
如果是这样的话,你最好重新考虑一下你的设计,因为它正在进入一个对你所使用的语言来说不自然的地方(最喜欢去高速公路上有毛毛虫,或者在有水的汽车里)
我相信我有一个使用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)
| 归档时间: |
|
| 查看次数: |
231000 次 |
| 最近记录: |