개요
- 기본적으로는
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