#include <iostream>
#include <type_traits>
struct A { };
struct B { };
struct C {
template <typename U,
typename std::enable_if<std::is_integral<U>::value>::type* = nullptr>
explicit operator U() const {
return 1;
}
template<typename U,
typename std::enable_if<std::is_same<U, A>::value>::type* = nullptr>
explicit operator U() const {
return A{ };
}
template<typename U,
typename std::enable_if<std::is_same<U, B>::value>::type* = nullptr>
explicit operator U() const {
return B{ };
}
};
int main() {
C c;
long y = static_cast<int>(c);
B b = static_cast<B>(c);
A a = static_cast<A>(c);
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dHlwZV90cmFpdHM+CgpzdHJ1Y3QgQSB7IH07CnN0cnVjdCBCIHsgfTsKCnN0cnVjdCBDIHsKICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBVLAogICAgICAgICAgICAgIHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfaW50ZWdyYWw8VT46OnZhbHVlPjo6dHlwZSogPSBudWxscHRyPgogICAgZXhwbGljaXQgb3BlcmF0b3IgVSgpIGNvbnN0IHsKICAgICAgICByZXR1cm4gMTsKICAgIH0KICAgIAogICAgdGVtcGxhdGU8dHlwZW5hbWUgVSwKCSB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX3NhbWU8VSwgQT46OnZhbHVlPjo6dHlwZSogPSBudWxscHRyPgogICAgZXhwbGljaXQgb3BlcmF0b3IgVSgpIGNvbnN0IHsKICAgICAgICByZXR1cm4gQXsgfTsKICAgIH0KICAgIAogICAgIHRlbXBsYXRlPHR5cGVuYW1lIFUsCgkgdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8c3RkOjppc19zYW1lPFUsIEI+Ojp2YWx1ZT46OnR5cGUqID0gbnVsbHB0cj4KICAgIGV4cGxpY2l0IG9wZXJhdG9yIFUoKSBjb25zdCB7CiAgICAgICAgcmV0dXJuIEJ7IH07CiAgICB9CiAgICAKfTsKCmludCBtYWluKCkgewogICAgQyBjOwogICAgbG9uZyB5ID0gc3RhdGljX2Nhc3Q8aW50PihjKTsKICAgIEIgYiA9IHN0YXRpY19jYXN0PEI+KGMpOwogICAgQSBhID0gc3RhdGljX2Nhc3Q8QT4oYyk7Cn0=