#include <iostream>
using namespace std;
#include <type_traits>
template <typename T>
struct foo
{
template <typename U = T>
typename std::enable_if<sizeof(U) && (false == std::is_same<T, long>::value)>::type
//typename std::enable_if<false == std::is_same<U, long>::value>::type
bar1 (int)
{cout<<"bar1\n"; }
template <typename U = T>
typename std::enable_if<sizeof(U) && (false == std::is_same<T, long>::value), int>::type
//typename std::enable_if<false == std::is_same<U, long>::value, int>::type
bar2 ()
{ cout<<"bar2\n"; return 0; }
};
int main()
{
foo<int> fi;
foo<long> fl;
fi.bar1(0); // compile
fi.bar2(); // compile
//fl.bar1<int>(0); // compilation error
// fl.bar2(); // compilation error
}
I2luY2x1ZGUgPGlvc3RyZWFtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgoKdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CnN0cnVjdCBmb28KIHsKICAgdGVtcGxhdGUgPHR5cGVuYW1lIFUgPSBUPgogICB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxzaXplb2YoVSkgJiYgKGZhbHNlID09IHN0ZDo6aXNfc2FtZTxULCBsb25nPjo6dmFsdWUpPjo6dHlwZQogICAvL3R5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPGZhbHNlID09IHN0ZDo6aXNfc2FtZTxVLCBsb25nPjo6dmFsdWU+Ojp0eXBlCiAgICAgIGJhcjEgKGludCkKICAgICAgIHtjb3V0PDwiYmFyMVxuIjsgfQoKICAgdGVtcGxhdGUgPHR5cGVuYW1lIFUgPSBUPgogICB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxzaXplb2YoVSkgJiYgKGZhbHNlID09IHN0ZDo6aXNfc2FtZTxULCBsb25nPjo6dmFsdWUpLCBpbnQ+Ojp0eXBlCiAgIC8vdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8ZmFsc2UgPT0gc3RkOjppc19zYW1lPFUsIGxvbmc+Ojp2YWx1ZSwgaW50Pjo6dHlwZQogICAgICBiYXIyICgpCiAgICAgICB7IGNvdXQ8PCJiYXIyXG4iOyByZXR1cm4gMDsgfQogfTsKCmludCBtYWluKCkKIHsKICAgZm9vPGludD4gIGZpOwogICBmb288bG9uZz4gZmw7CgogICBmaS5iYXIxKDApOyAvLyBjb21waWxlCiAgIGZpLmJhcjIoKTsgIC8vIGNvbXBpbGUKCiAgICAvL2ZsLmJhcjE8aW50PigwKTsgLy8gY29tcGlsYXRpb24gZXJyb3IKICAgLy8gZmwuYmFyMigpOyAgLy8gY29tcGlsYXRpb24gZXJyb3IKIH0K