#include <iostream>
#include <type_traits>
using namespace std;
struct A {
A(int) {}
};
struct B {
B() {}
};
template <typename T, typename = typename enable_if<is_constructible<T, int>::value>::type>
bool foo(){
return true;
}
template <typename T, typename = typename enable_if<!is_constructible<T, int>::value>::type>
bool foo(...) {
return false;
}
int main() {
std::cout << foo<A>() << '\n';
std::cout << foo<B>() << '\n';
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dHlwZV90cmFpdHM+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgpzdHJ1Y3QgQSB7CglBKGludCkge30KfTsKCnN0cnVjdCBCIHsKCUIoKSB7fQp9OwoKdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lID0gdHlwZW5hbWUgZW5hYmxlX2lmPGlzX2NvbnN0cnVjdGlibGU8VCwgaW50Pjo6dmFsdWU+Ojp0eXBlPgpib29sIGZvbygpewoJcmV0dXJuIHRydWU7Cn0KCnRlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSA9IHR5cGVuYW1lIGVuYWJsZV9pZjwhaXNfY29uc3RydWN0aWJsZTxULCBpbnQ+Ojp2YWx1ZT46OnR5cGU+CmJvb2wgZm9vKC4uLikgewoJcmV0dXJuIGZhbHNlOwp9CgppbnQgbWFpbigpIHsKCXN0ZDo6Y291dCA8PCBmb288QT4oKSA8PCAnXG4nOwoJc3RkOjpjb3V0IDw8IGZvbzxCPigpIDw8ICdcbic7CglyZXR1cm4gMDsKfQ==