std::type_info::name
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)
|
同じ型に対して同一の値を返す
(公開メンバ関数) |