RTTI(Run Time Type Information)
실행시간에 타입의 정보를 얻을 때 사용하는 기술
<typeinfo> 헤더 포함하고 typeid 연산자를 사용하면 된다.
타입의 정보를 담은 type_info 객체를 얻을 수 있다.
type_info 객체의 멤버 함수 name()을 사용해 출력 가능하다.
#include <iostream>
#include <typeinfo>
int main()
{
int n1 = 10;
auto n2 = n1; // n2의 타입은 int ?
const std::type_info& t1 = typeid(n2);
std::cout << t1.name() << std::endl;
}
int 형을 기라키는 i 가 출력된다.
#include <iostream>
#include <typeinfo>
int main()
{
std::type_info t2; // error
// 사용자가 직접 객체를 만들 수 없음, typeid()연산자를 통해서만 얻을 수 있다.
auto n1 = 10;
typeid(n1);
typeid(int);
const std::type_info& t = typeid(3 + 4.2);
std::cout << t.name() << std::endl;
}
type_info 객체를 만들 수 없기 때문에 아래와 같이 에러가 출력된다.
main.cpp:7:20: error: no matching function for call to ‘std::type_info::type_info()’
7 | std::type_info t2; // error
| ^~
In file included from /usr/include/c++/9/bits/exception_ptr.h:39,
from /usr/include/c++/9/exception:143,
from /usr/include/c++/9/ios:39,
from /usr/include/c++/9/ostream:38,
from /usr/include/c++/9/iostream:39,
from main.cpp:1:
/usr/include/c++/9/typeinfo:178:5: note: candidate: ‘std::type_info::type_info(const std::type_info&)’
178 | type_info(const type_info&);
| ^~~~~~~~~
/usr/include/c++/9/typeinfo:178:5: note: candidate expects 1 argument, 0 provided
/usr/include/c++/9/typeinfo:173:14: note: candidate: ‘std::type_info::type_info(const char*)’
173 | explicit type_info(const char *__n): __name(__n) { }
| ^~~~~~~~~
/usr/include/c++/9/typeinfo:173:14: note: candidate expects 1 argument, 0 provided
RTTI 타입 비교
타입을 출력하는 것이 아니라 조사하고 싶을 때
2개의 type_info 객체를 == 연산자로 비교할 수 있다.
typeid 의 결과를 비교해도 된다.
#include <iostream>
#include <typeinfo>
int main()
{
auto n1 = 10;
const std::type_info& t1 = typeid(n1);
const std::type_info& t2 = typeid(int);
if ( t1 == t2 )
{
std::cout << "same" << std::endl;
}
if ( t1.hash_code() == t2.hash_code() )
{
std::cout << "same" << std::endl;
}
std::cout << t1.name() << std::endl;
}
RTTI 의 다양한 예시
int, float, double, vector, array는 어떤 name()으로 출력되는지 확인해본다.
#include <iostream>
#include <typeinfo>
#include <vector>
#include <array>
using namespace std;
int main()
{
auto n1 = 10;
const std::type_info& t = typeid(n1);
cout << t.name() << endl;
cout << typeid(int).name() << endl;
cout << typeid(3 + 4.2).name() << endl;
float value = 3+4.2;
cout << typeid(value).name() << endl;
vector<int> v;
v.push_back(1);
cout << typeid(v).name() << endl;
cout << typeid(v.at(0)).name() << endl;
vector<double> v1;
v1.push_back(1);
cout << typeid(v1).name() << endl;
cout << typeid(v1.at(0)).name() << endl;
array<double, 2> aa = {1,2};
cout << typeid(aa).name() << endl;
cout << typeid(aa[0]).name() << endl;
array<int, 3> bb = {1,2,3};
cout << typeid(bb).name() << endl;
cout << typeid(bb[0]).name() << endl;
}
출력 결과에서 보면 vector, array 의 경우는 다른 형태로 출력됨을 알 수 있다.
vector와 array 내부 타입 정보도 출력됨을 알 수 있다.
'C++' 카테고리의 다른 글
[C++] 다중 상속 (multiple inheritance) (0) | 2021.12.31 |
---|---|
[C++] 상속과 RTTI (0) | 2021.12.30 |
[C++] 추상 클래스 (abstract class), 인터페이스(interface) (0) | 2021.12.28 |
[C++] virtual function (가상 함수), function override(오버라이드) (0) | 2021.08.28 |
[C++] upcasting (업캐스팅) (0) | 2021.08.27 |
댓글