我如何获得变量的类型?

时间:2012-07-03 12:27:02

标签: c++ variables typeof

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

10 个答案:

答案 0 :(得分:106)

您可以使用the typeid operator

#include <typeinfo>
...
cout << typeid(variable).name() << endl;

答案 1 :(得分:21)

对于静态断言,C ++ 11引入了decltype,这在某些情况下非常有用。

答案 2 :(得分:10)

如果您有变量

int k;

您可以使用

获取其类型
cout << typeid(k).name() << endl;

请参阅SO上的以下主题:Similar question

答案 3 :(得分:9)

通常,想要在C ++中找到变量的类型是错误的问题。它往往是你从程序语言中携带的东西,例如C或Pascal。

如果您想根据类型编写不同的行为,请尝试了解例如function overloadingobject 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;
}

请注意,如果两者同时起作用,那么它们将如何工作。