#include <iostream>
#include <type_traits>
#include <cstdint>
int GetId( )
{
static int id = 0 ;
id++ ;
return id;
}
template < class T>
struct TypeId
{
typedef T type;
static const int id;
} ;
template < class T>
struct TypeId< T* >
{
typedef T* type;
static const int id = - 1 ;
} ;
//static
template < class T>
const int TypeId< T> :: id = GetId( ) ;
class A
{
} ;
class B
{
} ;
class C
{
public :
C( )
{
std:: cout << "id of this for C = " << TypeId< std:: remove_pointer < decltype( this ) > :: type > :: id << std:: endl ;
}
} ;
template < class T>
void foo( T & val)
{
std:: cout << "foo, id of T = " << TypeId< T> :: id << std:: endl ;
}
int main( int argc, char * argv[ ] )
{
int n = 0 ;
foo( n) ;
int * pn = & n;
foo( pn) ;
char ch = 'a' ;
foo( ch) ;
char * pch = & ch;
foo( pch) ;
std:: cout << "id of A = " << TypeId< A> :: id << std:: endl ;
std:: cout << "id of C = " << TypeId< C> :: id << std:: endl ;
std:: cout << "id of A = " << TypeId< A> :: id << std:: endl ;
std:: cout << "id of B = " << TypeId< B> :: id << std:: endl ;
std:: cout << "id of C = " << TypeId< C> :: id << std:: endl ;
std:: cout << "id of int = " << TypeId< int > :: id << std:: endl ;
std:: cout << "id of int32_t=" << TypeId< int32_t > :: id << std:: endl ;
std:: cout << "id of int16_t=" << TypeId< int16_t > :: id << std:: endl ;
std:: cout << "id of int* = " << TypeId< int * > :: id << std:: endl ;
std:: cout << "id of A* = " << TypeId< A* > :: id << std:: endl ;
return 0 ;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dHlwZV90cmFpdHM+CiNpbmNsdWRlIDxjc3RkaW50PgoKaW50IEdldElkKCkKewogIHN0YXRpYyBpbnQgaWQgPSAwOwogIGlkKys7CiAgcmV0dXJuIGlkOwp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgVD4Kc3RydWN0IFR5cGVJZAp7CiAgdHlwZWRlZiBUIHR5cGU7CiAgc3RhdGljIGNvbnN0IGludCBpZDsKfTsKCgp0ZW1wbGF0ZSA8Y2xhc3MgVD4Kc3RydWN0IFR5cGVJZDxUKj4KewogIHR5cGVkZWYgVCogdHlwZTsKICBzdGF0aWMgY29uc3QgaW50IGlkID0gLTE7Cn07CgoKLy9zdGF0aWMgCnRlbXBsYXRlIDxjbGFzcyBUPgpjb25zdCBpbnQgVHlwZUlkPFQ+OjppZCA9IEdldElkKCk7CgoKY2xhc3MgQQp7Cn07CgpjbGFzcyBCCnsKfTsKCgpjbGFzcyBDCnsKICBwdWJsaWM6CiAgICBDKCkKICAgIHsKICAgICAgc3RkOjpjb3V0IDw8ICJpZCBvZiB0aGlzIGZvciBDID0gIiAgIDw8IFR5cGVJZDxzdGQ6OnJlbW92ZV9wb2ludGVyPGRlY2x0eXBlKHRoaXMpPjo6dHlwZT46OmlkICAgPDwgc3RkOjplbmRsOwogICAgfQp9OwoKCnRlbXBsYXRlPGNsYXNzIFQ+CnZvaWQgZm9vKFQgJiB2YWwpCnsKICAgIHN0ZDo6Y291dCA8PCAiZm9vLCBpZCBvZiBUID0gIiA8PCBUeXBlSWQ8VD46OmlkIDw8IHN0ZDo6ZW5kbDsKfQoKCmludCBtYWluKGludCBhcmdjLCBjaGFyKiBhcmd2W10pCnsKICAgIGludCBuID0gMDsKICAgIGZvbyhuKTsKICAgIGludCogcG4gPSAmbjsKICAgIGZvbyhwbik7CiAgICBjaGFyIGNoID0gJ2EnOwogICAgZm9vKGNoKTsKICAgIGNoYXIqIHBjaCA9ICZjaDsKICAgIGZvbyhwY2gpOwoKCiAgICBzdGQ6OmNvdXQgPDwgImlkIG9mIEEgPSAiICAgIDw8IFR5cGVJZDxBPjo6aWQgICAgPDwgc3RkOjplbmRsOwogICAgc3RkOjpjb3V0IDw8ICJpZCBvZiBDID0gIiAgICA8PCBUeXBlSWQ8Qz46OmlkICAgIDw8IHN0ZDo6ZW5kbDsKICAgIHN0ZDo6Y291dCA8PCAiaWQgb2YgQSA9ICIgICAgPDwgVHlwZUlkPEE+OjppZCAgICA8PCBzdGQ6OmVuZGw7CiAgICBzdGQ6OmNvdXQgPDwgImlkIG9mIEIgPSAiICAgIDw8IFR5cGVJZDxCPjo6aWQgICAgPDwgc3RkOjplbmRsOwogICAgc3RkOjpjb3V0IDw8ICJpZCBvZiBDID0gIiAgICA8PCBUeXBlSWQ8Qz46OmlkICAgIDw8IHN0ZDo6ZW5kbDsKICAgIHN0ZDo6Y291dCA8PCAiaWQgb2YgaW50ID0gIiAgPDwgVHlwZUlkPGludD46OmlkICA8PCBzdGQ6OmVuZGw7CiAgICBzdGQ6OmNvdXQgPDwgImlkIG9mIGludDMyX3Q9IiA8PCBUeXBlSWQ8aW50MzJfdD46OmlkICA8PCBzdGQ6OmVuZGw7CiAgICBzdGQ6OmNvdXQgPDwgImlkIG9mIGludDE2X3Q9IiA8PCBUeXBlSWQ8aW50MTZfdD46OmlkICA8PCBzdGQ6OmVuZGw7CiAgICBzdGQ6OmNvdXQgPDwgImlkIG9mIGludCogPSAiIDw8IFR5cGVJZDxpbnQqPjo6aWQgPDwgc3RkOjplbmRsOwogICAgc3RkOjpjb3V0IDw8ICJpZCBvZiBBKiA9ICIgICA8PCBUeXBlSWQ8QSo+OjppZCAgIDw8IHN0ZDo6ZW5kbDsKCiAgICByZXR1cm4gMDsKfQo=