198

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

4

10 回答 10

237

您可以使用typeid 运算符

#include <typeinfo>
...
cout << typeid(variable).name() << endl;
于 2012-07-03T12:30:25.957 回答
51

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

于 2016-08-08T16:14:46.150 回答
21

如果你有一个变量

int k;

您可以使用

cout << typeid(k).name() << endl;

请参阅关于 SO 的以下线程:类似问题

于 2012-07-03T12:31:21.990 回答
15

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

在动态类型语言中,变量可以包含任何东西,并且它的类型由它所持有的值给出,每时每刻。在静态类型语言中,变量的类型是声明的,并且不能更改。

可以有动态分派和对象组合和子类型(继承和虚函数)以及静态分派和超类型(通过模板 CRTP),但无论如何编译器必须知道变量的类型。

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

如果是这种情况,你最好重新考虑你的设计,因为它会进入一个不适合你使用的语言的土地(最喜欢带着毛毛虫在高速公路上行驶,或者带着汽车在水中行驶)

于 2012-07-03T13:33:28.247 回答
9

通常,想要在 C++ 中查找变量的类型是错误的问题。它往往是您从诸如 C 或 Pascal 之类的过程语言中携带的东西。

如果您想根据类型编写不同的行为,请尝试了解例如函数重载对象继承。在您使用 C++ 的第一天,这不会立即生效,但请坚持下去。

于 2012-07-03T12:34:18.520 回答
8

我相信我有一个使用 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
}
于 2016-05-25T00:16:33.193 回答
4
#include <typeinfo>

...
string s = typeid(YourClass).name()
于 2012-07-03T12:31:30.850 回答
4

我不确定我的回答是否会有所帮助。

简短的回答是,您并不真的需要/想知道变量的类型来使用它。

如果您需要为静态变量指定类型,那么您可以简单地使用 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);
}

它仍然有点乏味,但它尽可能接近无类型语言。只要确保每当您引用模板变量时,始终将模板规范放在那里。

于 2018-01-03T04:03:28.807 回答
0

如果您需要在类和已知类型之间进行比较,例如:

class Example{};
...
Example eg = Example();

您可以使用此比较线:

bool isType = string( typeid(eg).name() ).find("Example") != string::npos;

它检查typeid名称是否包含字符串类型(typeid 名称具有其他损坏的数据,因此最好使用 as1.find(s2)而不是==)。

于 2020-04-05T00:40:10.693 回答
-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;
}

注意 first 和 second if 是如何工作的。

于 2020-01-21T05:30:07.740 回答