Skip to content

[C++] 使用 typeid() 確認變數資料型態

Last Updated on 2021-10-22 by Clay

在 C++ 中,我們可以很清楚自己所定義的變數的資料型態;然而,對於第三方函式庫或是一些外部文件所傳入的參數,有時恐怕不是那麼有把握。

這時候,我們可以透過標準函式庫 typeinfo 中的 typeid() 來確認變數的資料型態。


typeid 使用方法

typeid() 返回的結果為 type_info 型態,也可以使用 .name() 函式返回系統型態名稱(是 C-style 字串,可以透過 printf("%s") 印出)。

.name() 返回的結果可以參考下表:

資料型態name() 返回名稱參考
boolb
charc
signed chara
unsigned charh
signed short ints
unsigned short intt
signed inti
unsigned intj
signed long intl
unsigned long intm
signed long long intx
unsigned long long inty
floatf
doubled
long doublee

除了這些基本的資料型態外,還有許多不同的類型,比方說 STL、自訂義類別之類的。大家可以稍微試試。


以下是段範例程式碼:

#include <iostream>
#include <typeinfo>


int main() {
    // Init
    int a = 10;
    long int b = 100000;
    int c = 10;

    // typeid()
    const std::type_info &ai = typeid(a);
    const std::type_info &bi = typeid(b);
    const std::type_info &ci = typeid(c);

    // Print
    printf("a: %p | %s\n", &ai, ai.name());
    printf("b: %p | %s\n", &bi, bi.name());
    printf("c: %p | %s\n\n", &ci, ci.name());

    // Judge a == b
    printf("&ai == &bi: %d\n", &ai == &bi);                         // Not guaranteed
    printf("hash_code : %d\n\n", ai.hash_code() == bi.hash_code()); // Guaranteed

    // Judge a == c
    printf("&ai == &ci: %d\n", &ai == &ci);                         // Not guaranteed
    printf("hash_code : %d\n", ai.hash_code() == ci.hash_code());  // Guaranteed

    return 0;
}


Output:

a: 0x7fff8027dbe8 | i
b: 0x7fff8027dc88 | l
c: 0x7fff8027dbe8 | i

&ai == &bi: 0
hash_code : 0

&ai == &ci: 1
hash_code : 1

References


Read More

Tags:

Leave a Reply