std::type_info::name
const char* name() const;
|
(C++11부터 noexcept) | |
타입의 이름을 포함하는 구현 정의된 널 종료 문자열을 반환합니다. 아무런 보장도 주어지지 않습니다. 특히, 반환된 문자열은 여러 타입에 대해 동일할 수 있으며 동일한 프로그램의 호출 간에 변경될 수 있습니다.
매개변수
(없음)
반환값
널 종료 문자 문자열 에는 해당 타입의 이름이 포함됩니다.
참고 사항
반환된 포인터가 가리키는 배열의 수명은 명시되어 있지 않지만, 실제로는 주어진 타입에 대한 RTTI 데이터 구조가 존재하는 동안 지속되며, 이는 동적 라이브러리(언로드 가능)에서 로드되지 않는 한 애플리케이션 수명 동안 유지됩니다.
일부 구현체(MSVC, IBM, Oracle 등)는 사람이 읽을 수 있는 타입 이름을 생성합니다. 다른 구현체, 특히 gcc와 clang은
Itanium C++ ABI
에서 지정된 맹글링된 이름을 반환합니다. 맹글링된 이름은
abi::__cxa_demangle
와 같은 구현체별 API를 직접 사용하거나
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)
|
동일한 타입에 대해 일치하는 값을 반환합니다
(public member function) |