[C++] 자료형 출력
Updated:
개요
- 기본적으로는
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
-