Namespaces
Variants

std::type_info:: name

From cppreference.net
Utilities library
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)