Updated:

1 minute read

개요

  • 기본적으로는 typeid(T).name()를 이용
  • 직관적인 출력을 원하는 경우 아래의 템플릿 함수 사용
    • // C++98
      template <typename T> string type_name_of_98() {
          const string s = __PRETTY_FUNCTION__;
          const int prefixSize = s.find("[with T = ") + strlen("[with T = ");
             
          return string(s.data() + prefixSize, s.find(';') - prefixSize);
      }
             
      // C++11
      template <typename T> constexpr string type_name_of_11() {
          const string s = __PRETTY_FUNCTION__;
          const int prefixSize = s.find("[with T = ") + strlen("[with T = ");
             
          return string(s.data() + prefixSize, s.find(';') - prefixSize);
      }
             
      // C++17
      template <typename T> constexpr string_view type_name_of_17() {
          const string s = __PRETTY_FUNCTION__;
          const int prefixSize = s.find("[with T = ") + strlen("[with T = ");
             
          return string_view(s.data() + prefixSize, s.find(';') - prefixSize);
      }
      


예제

  • 코드
    • #include <cstring>
      #include <iostream>
      #include <string>
      #include <string_view>
      #include <typeinfo>
             
      using namespace std;
             
      class Test {};
             
      // C++98
      template <typename T> string type_name_of_98() {
          const string s = __PRETTY_FUNCTION__;
          const int prefixSize = s.find("[with T = ") + strlen("[with T = ");
             
          return string(s.data() + prefixSize, s.find(';') - prefixSize);
      }
             
      // C++11
      template <typename T> constexpr string type_name_of_11() {
          const string s = __PRETTY_FUNCTION__;
          const int prefixSize = s.find("[with T = ") + strlen("[with T = ");
             
          return string(s.data() + prefixSize, s.find(';') - prefixSize);
      }
             
      // C++17
      template <typename T> constexpr string_view type_name_of_17() {
          const string s = __PRETTY_FUNCTION__;
          const int prefixSize = s.find("[with T = ") + strlen("[with T = ");
             
          return string_view(s.data() + prefixSize, s.find(';') - prefixSize);
      }
             
      template <typename T> void type_name_test() {
          cout << typeid(T).name() << endl;
          cout << type_name_of_98<T>() << endl;
          cout << type_name_of_11<T>() << endl;
          cout << type_name_of_17<T>() << endl;
      }
             
      int main() {
          type_name_test<int>();
             
          cout << "------" << endl;
             
          type_name_test<int *>();
             
          cout << "------" << endl;
             
          type_name_test<double>();
             
          cout << "------" << endl;
             
          type_name_test<char *>();
             
          cout << "------" << endl;
             
          type_name_test<string>();
             
          cout << "------" << endl;
             
          type_name_test<Test>();
             
          return 0;
      }
      
  • 실행 결과
    • i
      int
      int
      int
      ------
      Pi
      int*
      int*
      int*
      ------
      d
      double
      double
      double
      ------
      Pc
      char*
      char*
      char*
      ------
      NSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE
      std::__cxx11::basic_string<char>
      std::__cxx11::basic_string<char>
      std::__cxx11::basic_string<char>
      ------
      4Test
      Test
      Test
      Test