C++ 获取变量类型

Namita Chaudhary 2023年10月12日
  1. C++ 获取变量类型
  2. 在 C++ 中使用 typeid 运算符查找变量的类型
  3. 在 C++ 中使用 decltype() 说明符查找变量的类型
  4. 结论
C++ 获取变量类型

本文将探讨在标准 C++ 中查找变量数据类型的不同方法。

C++ 获取变量类型

在某些情况下,我们需要在 C++ 中查找变量的动态类型或运行时的类型。因此,C++ 库为我们提供了不同的方法来查找变量的类型。

其中一种方法是使用 C++ 的 <typeinfo> 库中的 typeid 运算符。但是,另一种已在 C++11 中引入,称为 decltype(x),它将表达式转换为生成的结果的类型。

在旧版本的 C++ 中,每种数据类型都必须在编译时显式声明;但是,在较新的版本中,有一种工具可以自动推断表达式中的数据类型,这称为类型推断。decltype() 运算符还提供了自动推导表达式中数据类型的功能。

但是,我们将在本文中详细讨论每种方法。

在 C++ 中使用 typeid 运算符查找变量的类型

typeid 运算符存在于 C++ 的 <typeinfo> 库中,用于查找运行时提供的变量类型。但是,用于查找变量类型的完整函数是 typeid(x).name(),其中 x 是应该找到其类型的变量。

使用的 name() 成员函数返回标识变量类型的字符序列。

但是,它将返回数据类型的首字母作为输出。例如,对于 int,它将返回 i,对于 float``f,对于 double,它将返回 d 作为类型。

让我们看看在 C++ 中使用 typeid 运算符来查找变量类型的代码。

#include <iostream>
#include <typeinfo>
using namespace std;

int main() {
  int x = 200;
  float y = 200.790;
  cout << typeid(x).name() << endl;
  cout << typeid(y).name() << endl;
  cout << typeid(x * y).name() << endl;
  return 0;
}

输出:

i
f
f

上面的输出显示 i 指的是 integer 类型,而 f 指的是 float 类型。此外,C++ 中的 typeid 也用于返回表达式的类型。

在上面的例子中,在 typeid 运算符中传递的表达式是两种不同数据类型 intfloat 的乘积;因此,结果将被转换为更大的数据类型。

在 C++ 中使用 decltype() 说明符查找变量的类型

decltype(x) 说明符是在 C++11 中引入的。它是一个运算符,用于获取结果表达式的类型。

auto 关键字用于声明具有特定类型的变量,而 decltype 提取该变量类型。autodecltype 都基于类型推断,即自动推断数据类型。

让我们看一个使用 decltype 运算符在 C++ 中查找变量类型的示例。

#include <bits/stdc++.h>

#include <cstring>
using namespace std;

float function1() { return 4.5; }
int function2() { return 34; }
int main() {
  decltype(function1()) a;
  decltype(function2()) b;

  cout << typeid(a).name() << endl;
  cout << typeid(b).name() << endl;

  return 0;
}

输出:

f
i

上例中变量 ab 的数据类型将与 function1function2 的返回类型相同。

decltype 运算符的另一个示例如下,它提取 C++ 中表达式的类型。

#include <bits/stdc++.h>
using namespace std;

int main() {
  float ft = 4.8;
  decltype(ft) a = ft + 9.8;
  cout << typeid(a).name();
  return 0;
}

输出:

f

输出 f 指的是 float 数据类型。因此,添加表达式 ft+9.8 后,结果数据类型将是 float

然而,typeiddecltype 运算符之间的主要区别在于 typeid 在运行时提供有关类型的信息,而 decltype 在编译时提供类型信息。

结论

在本文中,我们讨论了如何在 C++ 中获取变量的类型。我们讨论了两种不同的方法;一种是使用 typeid(x).name(),它在运行时提供类型,而另一种是 decltype(x),它在编译时提供类型。

但是,这两种方法都有效且易于使用。