在C ++中,如何找到变量的类型?
答案 0 :(得分:106)
您可以使用the typeid operator:
#include <typeinfo>
...
cout << typeid(variable).name() << endl;
答案 1 :(得分:21)
对于静态断言,C ++ 11引入了decltype
,这在某些情况下非常有用。
答案 2 :(得分:10)
答案 3 :(得分:9)
通常,想要在C ++中找到变量的类型是错误的问题。它往往是你从程序语言中携带的东西,例如C或Pascal。
如果您想根据类型编写不同的行为,请尝试了解例如function overloading和object inheritance。这在C ++的第一天就没有意义,但要坚持下去。
答案 4 :(得分:7)
C ++和Javascript之间的主要区别在于C ++是一种静态类型的语言,而javascript是动态的。
在动态类型语言中,变量可以包含任何内容,并且它的类型由它所持有的值提供,时刻。 在静态类型语言中,声明了变量的类型,并且不能更改。
可以有动态调度和对象组合以及子类型(继承和虚函数)以及静态调度和超类型(通过模板CRTP),但在任何情况下,编译器都必须知道变量的类型。 / p>
如果你不知道它是什么或可能是什么,那是因为你设计的东西,因为语言有动态类型系统。
如果是这种情况,你最好重新考虑一下你的设计,因为它正在进入一个对你所使用的语言来说不自然的地方(最喜欢去高速公路上有毛毛虫,或者在水里有车) )
答案 5 :(得分: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
}
答案 6 :(得分:3)
我不确定我的回答是否会有所帮助。
简短的回答是,您并不真正需要/想知道要使用它的变量的类型。
如果您需要为静态变量提供类型,那么您可以简单地使用auto。
在更复杂的情况下,你想在类或结构中使用“auto”,我建议使用带有decltype的模板。
例如,假设您正在使用其他人的库,并且它有一个名为“unknown_var”的变量,您可能希望将其放在矢量或结构中,您可以完全执行此操作:
template <typename T>
struct my_struct {
int some_field;
T my_data;
};
vector<decltype(unknown_var)> complex_vector;
vector<my_struct<decltype(unknown_var)> > simple_vector
希望这有帮助。
编辑:为了更好的衡量,这是我能想到的最复杂的案例:拥有一个未知类型的全局变量。在这种情况下,您需要c ++ 14和模板变量。
这样的事情:
template<typename T> vector<T> global_var;
void random_func (auto unknown_var) {
global_var<decltype(unknown_var)>.push_back(unknown_var);
}
它仍然有点单调乏味,但它与无类型语言一样接近。只要确保无论何时引用模板变量,都要将模板规范放在那里。
答案 7 :(得分:2)
#include <typeinfo>
...
string s = typeid(YourClass).name()
答案 8 :(得分:0)
如果需要在类和已知类型之间进行比较,例如:
class Example{};
...
Example eg = Example();
您可以使用以下比较行:
bool isType = string( typeid(eg).name() ).find("Example") != string::npos;
检查typeid
名称是否包含字符串类型(typeid名称具有其他损坏的数据,因此最好使用s1.find(s2)
而不是==
)。
答案 9 :(得分:-1)
您绝对可以使用typeid(x).name()
,其中x是变量名。它实际上返回一个指向数据类型的const char指针。现在,看下面的代码。
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n = 36;
char c = 'A';
double d = 1.2;
if(*(typeid(n).name()) == 'i'){
cout << "I am an Integer variable" << endl;
}
if(*((char *) typeid(d).name()) == 'd'){
cout << "I am a Double variable" << endl;
}
if(*((char *) typeid(c).name()) == 'c'){
cout << "I am a Char variable" << endl;
}
return 0;
}
请注意,如果两者同时起作用,那么它们将如何工作。