Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/131.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何获取变量的类型? C++中,如何找到变量的类型?_C++_Variables_Typeof - Fatal编程技术网

如何获取变量的类型? 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-So
I
在你的编译器上是整数。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;