#include <iostream>
using namespace std;
class A0{ //saparate here to make identity
public:
enum ENU{
T1,T2
};
};
namespace namesp {
template<typename T>
struct identity { typedef T type; };
template <A0::ENU T>
struct EnumToBuiltin {
};
template <>
struct EnumToBuiltin<A0::T1> {
typedef int type;
};
template <>
struct EnumToBuiltin<A0::T2> {
typedef std::string type;
};
}
class B : public A0{
public:
int b=123;
std::string c="I am C";
template<ENU ttt> typename namesp::EnumToBuiltin<ttt>::type f(){
return getField_(namesp::EnumToBuiltin<ttt>());
}
int getField_(namesp::EnumToBuiltin<T1>){
return b;
}
std::string getField_(namesp::EnumToBuiltin<T2>){
return c;
}
};
int main() {
B b;
cout<< b.f<B::T1>(); //int
cout<< b.f<B::T2>(); //string
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKY2xhc3MgQTB7IC8vc2FwYXJhdGUgaGVyZSB0byBtYWtlIGlkZW50aXR5IAoJcHVibGljOgoJZW51bSBFTlV7CgkgICAgVDEsVDIJCgl9Owp9OwpuYW1lc3BhY2UgbmFtZXNwIHsKCXRlbXBsYXRlPHR5cGVuYW1lIFQ+CglzdHJ1Y3QgaWRlbnRpdHkgeyB0eXBlZGVmIFQgdHlwZTsgfTsgIAoJCgl0ZW1wbGF0ZSA8QTA6OkVOVSBUPgoJc3RydWN0IEVudW1Ub0J1aWx0aW4gewoJfTsKCQoJdGVtcGxhdGUgPD4KCXN0cnVjdCBFbnVtVG9CdWlsdGluPEEwOjpUMT4gewoJICB0eXBlZGVmIGludCB0eXBlOwoJfTsKCXRlbXBsYXRlIDw+CglzdHJ1Y3QgRW51bVRvQnVpbHRpbjxBMDo6VDI+IHsKCSAgdHlwZWRlZiBzdGQ6OnN0cmluZyB0eXBlOwoJfTsgCn0KCmNsYXNzIEIgOiBwdWJsaWMgQTB7CglwdWJsaWM6CglpbnQgYj0xMjM7CglzdGQ6OnN0cmluZyBjPSJJIGFtIEMiOwoJdGVtcGxhdGU8RU5VIHR0dD4gdHlwZW5hbWUgbmFtZXNwOjpFbnVtVG9CdWlsdGluPHR0dD46OnR5cGUgZigpewoJICAgIHJldHVybiBnZXRGaWVsZF8obmFtZXNwOjpFbnVtVG9CdWlsdGluPHR0dD4oKSk7Cgl9CglpbnQgZ2V0RmllbGRfKG5hbWVzcDo6RW51bVRvQnVpbHRpbjxUMT4pewoJCXJldHVybiBiOwoJfQoJc3RkOjpzdHJpbmcgZ2V0RmllbGRfKG5hbWVzcDo6RW51bVRvQnVpbHRpbjxUMj4pewoJCXJldHVybiBjOwoJfQp9OwoKaW50IG1haW4oKSB7CglCIGI7CiAgICBjb3V0PDwgYi5mPEI6OlQxPigpOyAvL2ludAoJY291dDw8IGIuZjxCOjpUMj4oKTsgLy9zdHJpbmcKCXJldHVybiAwOwp9