Namespaces
Variants

std::type_info:: name

From cppreference.net
Utilities library
const char * name ( ) const ;
(C++11以降 noexcept)

型の名前を含む、実装定義のヌル終端文字列を返します。保証は一切ありません。特に、返される文字列は複数の型で同一である可能性があり、同じプログラムの複数回の呼び出し間で変更される可能性があります。

目次

パラメータ

(なし)

戻り値

Null-terminated character string 型の名前を含む。

注記

返されたポインタが指す配列の寿命は規定されていませんが、実際には指定された型のRTTIデータ構造が存在する限り持続します。これは、動的ライブラリ(アンロード可能)からロードされた場合を除き、アプリケーションの寿命と同じ期間持続します。

一部の実装(MSVC、IBM、Oracleなど)は人間が読める型名を生成します。他の実装、特にgccとclangはマングルされた名前を返します。これは Itanium C++ ABI で規定されています。マングルされた名前は、実装固有のAPI( abi::__cxa_demangle を直接使用するか、 boost::core::demangle を通じて)を使用して人間が読める形式に変換できます。また、コマンドラインユーティリティ c ++ filt - t を通じてパイプ処理することもできます。

#include <boost/core/demangle.hpp>
#include <cstdlib>
#include <iostream>
#include <string>
#include <typeinfo>
struct Base { virtual ~Base() = default; };
struct Derived : Base {};
int main()
{
    Base b1;
    Derived d1;
    const Base* pb = &b1;
    std::cout << typeid(*pb).name() << '\n';
    pb = &d1;
    std::cout << typeid(*pb).name() << '\n';
    std::string real_name = boost::core::demangle(typeid(pb).name());
    std::cout << typeid(pb).name() << " => " << real_name << '\n';
    std::cout << "c++filt => " << std::flush;
    std::string s = typeid(pb).name();
    std::system(("c++filt -t " + s).data());
}

出力例:

// GCC/Clang:
4Base
7Derived
PK4Base => Base const*
c++filt => Base const*
// MSVC:
struct Base
struct Derived
struct Base const * __ptr64 => struct Base const * __ptr64

関連項目

(C++11)
同じ型に対して同一の値を返す
(公開メンバ関数)