#include <iostream>
using namespace std;
struct A {};
struct B {};
struct C {};
template <typename T>
struct getID;
template <>
struct getID<A>
{
constexpr static int ID = 1;
};
template <>
struct getID<B>
{
constexpr static int ID = 2;
};
template <>
struct getID<C>
{
constexpr static int ID = 3;
};
template<typename T>
void testID(T val)
{
cout << getID<T>::ID << endl;
}
int main()
{
testID(A{});
testID(B{});
testID(C{});
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCnN0cnVjdCBBIHt9OwpzdHJ1Y3QgQiB7fTsKc3RydWN0IEMge307Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4Kc3RydWN0IGdldElEOwoKdGVtcGxhdGUgPD4Kc3RydWN0IGdldElEPEE+CnsKCWNvbnN0ZXhwciBzdGF0aWMgaW50IElEID0gMTsKfTsKCnRlbXBsYXRlIDw+CnN0cnVjdCBnZXRJRDxCPgp7Cgljb25zdGV4cHIgc3RhdGljIGludCBJRCA9IDI7Cn07Cgp0ZW1wbGF0ZSA8PgpzdHJ1Y3QgZ2V0SUQ8Qz4KewoJY29uc3RleHByIHN0YXRpYyBpbnQgSUQgPSAzOwp9OwoKdGVtcGxhdGU8dHlwZW5hbWUgVD4Kdm9pZCB0ZXN0SUQoVCB2YWwpCnsKCWNvdXQgPDwgZ2V0SUQ8VD46OklEIDw8IGVuZGw7Cn0KCmludCBtYWluKCkKewoJdGVzdElEKEF7fSk7Cgl0ZXN0SUQoQnt9KTsKCXRlc3RJRChDe30pOwoKCXJldHVybiAwOwp9