#include <iostream>
#include <typeinfo.h>
// template에서instatiation 된type을알아보는방법
// const T& 는char const[6] 그러므로문자열의길이가다르다면에러!!
// T 는char const* 으로타입이결정된다.
// 그러므로타입을정할때조심해서정해야한다.!!!
template<typename T> void foo( T a, T b )
{
cout << typeid(a).name() << endl;
}
template<typename T> void goo( const T& a, const T& b )
{
cout << typeid(a).name() << endl;
}
void main()
{
foo( "hello", "hel" );
goo( "hello", "hello" );
//goo( "hello", "hel" ); // error
}
///////////////////////////////////////////////////////////////////
// RTTI : Run Time Type Information
class A
{
public:
virtual ~A() {} // 상속이라면100% 가상함수를쓰게된다.
};
void foo( B* p )
{
}
class B : public A
{
public:
};
void foo( A* p )
{
// 여기서p가A인지B인지를알고싶다면!!
// B* pp = (B*)p; // error A가넘어오게되면undefine??
// 방법1. typeid() 연산자사용
const type_info& t = typeid(*p); // 6.0에서는\GR 옵션을줘야한다.
cout << t.name() << endl; // 가상함수가있어야제대로동작한다(소멸자라도추가)
if ( typeid(*p) == typeid(B) )
{
B* pp = (B*)p; // 안전하다.
}
// 방법2. 이거만하도록나온dynamic_cast. DYNAMIC_CAST() <-- MFC용
B* p2 = dynamic_cast<B*>(p); // down cast 가발생하면0이리턴된다.
if ( p2 != 0 )
{
// p2사용
}
}
void main()
{
B b;
foo( &b );
}