如何获取变量的类型? C++中,如何找到变量的类型?
,可以使用:如何获取变量的类型? C++中,如何找到变量的类型?,c++,variables,typeof,C++,Variables,Typeof,,可以使用: #包括 ... 如果你有一个变量 int k; 您可以使用 cout << typeid(k).name() << endl; cout#包括 ... 字符串s=typeid(YourClass).name() 代码>通常,想要找到C++中变量的类型是错误的问题。它往往是从过程语言(例如C或Pascal)中继承下来的东西 如果您想根据类型对不同行为进行编码,请尝试了解,例如和。这在C++的第一天就没有意义,但请坚持下去。 < P> C++和Javascr
#包括
...
如果你有一个变量
int k;
您可以使用
cout << typeid(k).name() << endl;
cout#包括
...
字符串s=typeid(YourClass).name()
<>代码>通常,想要找到C++中变量的类型是错误的问题。它往往是从过程语言(例如C或Pascal)中继承下来的东西
如果您想根据类型对不同行为进行编码,请尝试了解,例如和。这在C++的第一天就没有意义,但请坚持下去。 < P> C++和Javascript的主要区别是C++是静态类型的语言,WILJavaScript是动态的。
在动态类型语言中,变量可以包含任何东西,其类型由它所持有的值逐时刻给出。
在静态类型语言中,变量的类型是声明的,不能更改
可以有动态分派、对象组合和子类型(继承和虚拟函数)以及静态分派和超级类型(通过模板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
}
对于静态断言,C++11引入了在某些场景中非常有用的方法。我不确定我的答案是否有用
简单的回答是,您不需要/不想知道使用它的变量的类型
如果需要为静态变量指定类型,则可以简单地使用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
模板
结构我的结构{
int一些_字段;
T我的_数据;
};
向量复向量;
简单向量
希望这有帮助
编辑:为了更好地衡量,这里是我能想到的最复杂的情况:具有未知类型的全局变量。在这种情况下,您需要c++14和模板变量
大概是这样的:
template<typename T> vector<T> global_var;
void random_func (auto unknown_var) {
global_var<decltype(unknown_var)>.push_back(unknown_var);
}
模板向量全局变量;
无效随机函数(自动未知变量){
全局变量推回(未知变量);
}
这仍然有点乏味,但它是尽可能接近无类型语言。只要确保在引用模板变量时,始终将模板规范放在那里。您完全可以选择typeid(x).name()
其中x是变量名。它实际上返回一个指向数据类型的常量字符指针。现在,看下面的代码
#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;
}
#包括
使用名称空间std;
int main()
{
int n=36;
字符c='A';
双d=1.2;
如果(*(typeid(n).name())=='i'){
cout如果需要在类和已知类型之间进行比较,例如:
class Example{};
...
Example eg = Example();
您可以使用此比较行:
bool isType = string( typeid(eg).name() ).find("Example") != string::npos;
检查typeid
名称是否包含字符串类型(typeid名称有其他损坏的数据,因此最好执行s1.查找(s2)
,而不是=
).可能重复的内容无法使用搜索或谷歌:)最严厉的是快速:D@Kariboo,我使用了谷歌,它把我送到这里。这个问题很不清楚,即使在看到了各种答案之后,也不清楚这个问题是否在寻找被接受的答案。@David-SoI
在你的编译器上是整数。na返回的mes不是标准指定的。当我在vector上使用它时,它返回st6vectoriaisaiee.WTF?@BobbyBrown您并不孤单!!通过typeid
返回的名称非常缩写,特定于编译器,不供人使用。您可以“demangle”它们(这是实际术语!)例如,代码中的命令行实用程序,如<代码> C++ + FILT<代码>,或者与任何在线的DeangRanges等,如果C++有动态变化,那么我认为它将是伟大的,类型和PARSETIN,PARSEFIFY功能也会派上用场,但我不知道为什么C++制造商会使它太难,例如,谁说写cout determination是最好的!!!!包括string str(“1912”);int strotintval;stringstream(str)>>strotintval;@Waqas,嗯,什么?说它最好的人是定义语言的人,在我看来,他们几乎对任何与之相关的事情都有最终决定权——比如说,良好的编码实践。你能重新表述一下这个评论,让它更有意义吗?我完全不同意。Java、C#、PHP、Perl、Python等等都是用C和C设计的++当你创建一个数据库应用程序来打开
class Example{};
...
Example eg = Example();
bool isType = string( typeid(eg).name() ).find("Example") != string::npos;