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),它在編譯時提供型別。

但是,這兩種方法都有效且易於使用。