#include <iostream>
#include <type_traits>
using namespace std;
typedef unsigned long mySize;
//default
template <class P, class dummy = void>
class T{
public:
static P f(){return 0;}
};
//int
template <>
class T<int,void> {
public:
static int f(){return 1;}
};
//unsigned long
template <>
class T<unsigned long, void> {
public:
static unsigned long f(){return 2;}
};
template <class P>
class T<P, typename enable_if<is_same<P, mySize>::value && !is_same<P, unsigned long>::value, void>::type> {
public:
static P f(){return 3;}
};
int main() {
cout << T<int>::f() << endl;
cout << T<unsigned long>::f() << endl;
cout << T<mySize>::f() << endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dHlwZV90cmFpdHM+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7Cgp0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbXlTaXplOwoKLy9kZWZhdWx0CnRlbXBsYXRlIDxjbGFzcyBQLCBjbGFzcyBkdW1teSA9IHZvaWQ+CmNsYXNzIFR7CglwdWJsaWM6CiAgIHN0YXRpYyBQIGYoKXtyZXR1cm4gMDt9Cn07CgovL2ludAp0ZW1wbGF0ZSA8PgpjbGFzcyBUPGludCx2b2lkPiB7CglwdWJsaWM6CiAgIHN0YXRpYyBpbnQgZigpe3JldHVybiAxO30KfTsKCi8vdW5zaWduZWQgbG9uZwp0ZW1wbGF0ZSA8PgpjbGFzcyBUPHVuc2lnbmVkIGxvbmcsIHZvaWQ+IHsKCXB1YmxpYzoKICAgc3RhdGljIHVuc2lnbmVkIGxvbmcgZigpe3JldHVybiAyO30KfTsKCnRlbXBsYXRlIDxjbGFzcyBQPgpjbGFzcyBUPFAsIHR5cGVuYW1lIGVuYWJsZV9pZjxpc19zYW1lPFAsIG15U2l6ZT46OnZhbHVlICYmICFpc19zYW1lPFAsIHVuc2lnbmVkIGxvbmc+Ojp2YWx1ZSwgdm9pZD46OnR5cGU+IHsKCXB1YmxpYzoKICAgc3RhdGljIFAgZigpe3JldHVybiAzO30KfTsKCmludCBtYWluKCkgewoJY291dCA8PCBUPGludD46OmYoKSA8PCBlbmRsOwoJY291dCA8PCBUPHVuc2lnbmVkIGxvbmc+OjpmKCkgPDwgZW5kbDsKCWNvdXQgPDwgVDxteVNpemU+OjpmKCkgPDwgZW5kbDsKCXJldHVybiAwOwp9