std::type_info::name
From cppreference.com
const char* name() const; |
(C++11 以降 noexcept) | |
型の名前を含む、実装定義のヌル終端文字列を返します。保証はありません。特に、返される文字列は複数の型で同一になる可能性があり、同じプログラムの呼び出し間で変更される可能性があります。
目次 |
[編集] Parameters
(なし)
[編集] Return value
ヌル終端文字列。型の名前を含みます。
[編集] Notes
返されたポインタが指す配列の生存期間は指定されていませんが、実際には、与えられた型のRTTIデータ構造が存在する限り持続します。これは、動的ライブラリからロードされた場合(アンロードされる可能性がある)を除き、アプリケーションの生存期間と同じです。
一部の実装(MSVC、IBM、Oracleなど)は、人間が読める型名を生成します。その他、特にgccやclangは、Itanium C++ ABIで指定されているマングリングされた名前を返します。マングリングされた名前は、`abi::__cxa_demangle`などの実装固有のAPIを直接、または`boost::core::demangle`を介して、人間が読める形式に変換できます。また、コマンドラインユーティリティ`c++filt -t`にパイプで渡すこともできます。
[編集] Example
このコードを実行
#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
[編集] See also
| (C++11) |
同じ型に対して同一の値が返されます (public member function) |