template <typename T, typename U>
struct is_same {
static const bool value = false;
};
template <typename T>
struct is_same<T, T> {
static const bool value = true;
};
template <bool, typename>
struct enable_if {
};
template <typename T>
struct enable_if<true, T> {
typedef T type;
};
template <typename OutType, typename InType>
typename enable_if<is_same<OutType, InType>::value, OutType>::type foo(const InType& x)
{
// OutType == InType
return x;
}
template <typename OutType, typename InType>
typename enable_if<!is_same<OutType, InType>::value, OutType>::type foo(const InType& x)
{
// OutType != InType
return x + x;
}
#include <iostream>
int main()
{
std::cout << foo<int>(1) << '\n'
<< foo<long>(1) << '\n';
}
dGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFU+CnN0cnVjdCBpc19zYW1lIHsKICAgIHN0YXRpYyBjb25zdCBib29sIHZhbHVlID0gZmFsc2U7Cn07CnRlbXBsYXRlIDx0eXBlbmFtZSBUPgpzdHJ1Y3QgaXNfc2FtZTxULCBUPiB7CiAgICBzdGF0aWMgY29uc3QgYm9vbCB2YWx1ZSA9IHRydWU7Cn07Cgp0ZW1wbGF0ZSA8Ym9vbCwgdHlwZW5hbWU+CnN0cnVjdCBlbmFibGVfaWYgewp9Owp0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4Kc3RydWN0IGVuYWJsZV9pZjx0cnVlLCBUPiB7CiAgICB0eXBlZGVmIFQgdHlwZTsKfTsKCnRlbXBsYXRlIDx0eXBlbmFtZSBPdXRUeXBlLCB0eXBlbmFtZSBJblR5cGU+CnR5cGVuYW1lIGVuYWJsZV9pZjxpc19zYW1lPE91dFR5cGUsIEluVHlwZT46OnZhbHVlLCBPdXRUeXBlPjo6dHlwZSBmb28oY29uc3QgSW5UeXBlJiB4KQp7CiAgICAvLyBPdXRUeXBlID09IEluVHlwZQogICAgcmV0dXJuIHg7Cn0KdGVtcGxhdGUgPHR5cGVuYW1lIE91dFR5cGUsIHR5cGVuYW1lIEluVHlwZT4KdHlwZW5hbWUgZW5hYmxlX2lmPCFpc19zYW1lPE91dFR5cGUsIEluVHlwZT46OnZhbHVlLCBPdXRUeXBlPjo6dHlwZSBmb28oY29uc3QgSW5UeXBlJiB4KQp7CiAgICAvLyBPdXRUeXBlICE9IEluVHlwZQogICAgcmV0dXJuIHggKyB4Owp9CgojaW5jbHVkZSA8aW9zdHJlYW0+CmludCBtYWluKCkKewogICAgc3RkOjpjb3V0IDw8IGZvbzxpbnQ+KDEpIDw8ICdcbicKICAgICAgICAgICAgICA8PCBmb288bG9uZz4oMSkgPDwgJ1xuJzsKfQo=