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


当前回答

你当然可以使用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;
}

注意第一个和第二个if是如何工作的。

其他回答

c++和Javascript的主要区别在于c++是静态类型的语言,而Javascript是动态的。

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

可以有动态分派、对象组合和子类型(继承和虚函数),也可以有静态分派和超类型(通过模板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
}

你可以使用typeid操作符:

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

如果你有一个变量

int k;

你可以使用它来获取它的类型

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

请看下面关于SO的帖子:类似的问题

带有abi::__cxa_demangle()的typeid操作符(仅GCC / Clang)

#include <iostream>
#include <typeinfo>
#if defined __GNUC__
#include <cxxabi.h>                     // GCC / Clang only
#endif

int main() {
    long long w;
    std::cout << typeid(w).name() << std::endl;                      // x

    #if defined __GNUC__      // GCC / Clang only
    char * name = abi::__cxa_demangle(typeid(w).name(), 0, 0, 0);
    std::cout << name << std::endl;                                  // long long
    free(name);
    #endif
}

叮当在线