سلام!

این جلسه می خواهیم نوع یه متغیر را شناسایی کنیم. این روش برای شناسایی خروجی توابع و همچنین موارد دیگر مفید است.

برای این کار باید کتاب خانه ی typeinfo را include کنید.

#include <typeinfo>

حالا می خواهیم نوع متغیر مورد نظرمان را مشخص کنیم. برای این کار از یک operator به نام typeid استفاده می کنیم. خروجی این operator یک type_info است. خود type_info یک تابع دارد به نام name که اسم متغیر را برمی گرداند.

بنابراین اگر بخواهیم نوع یک متغیر را بفهمیم، باید مانند کد زیر عمل کنیم؛

typeid( VARIABLE ).name()

در بعضی از کامپایلر ها این خروجی دقیقا نام متغیر نیست و بعضی از مشخصات متغیر با حروف و اعداد خاصی مشخّص می شوند. برای این که این نماد ها را تبدیل به نامی قابل فهم کنید، دو راه پیش رو دارید؛

راه حلّ اوّل: خروجی را به c++filt بدهید. برای این کار در terminal به صورت زیر عمل کنید؛

c++filt -t OUTPUT

مثل اگر خروجی برنامه ی شما PKc بوده است، باید در Terminal دستور زیر را وارد کنید؛

c++filst -t PKc

اگر در برنامه ی خود تنها همین خروجی را چاپ می کنید (و چیز دیگری را چاپ نمی کنید) می توانید این خروجی را به صورت زیر به c++filt بدهید؛

./test | c++filt

راه حلّ دوم: این راه حل کمی پیچیده است ولی خوبی آن این است که از این به بعد یک تابع برای شناسایی نوع متغیر دارید. استفاده از این دستورها (به دلیل وجود unique_ptr) تنها از c++11 به بعد مقدور است.

#include <iostream>
#include <typeinfo>
#include <cxxabi.h>
#include <string>
#include <memory>
#include <cstdlib>

std::string demangle( const char *mangled ) {
    int status;
    std::unique_ptr < char[], void (*) (void*) > result ( abi::__cxa_demangle( mangled, 0, 0, &status), std::free );
    if ( result.get() )
        return std::string( result.get() );
    return "Error occured";
}

حالا می توانید مانند کد زیر، نوع متغیر مورد نظر خود را به دست آورید.

cout << demangle( typeid( VARIABLE ).name() ) << endl;

موفق باشید!