#include <iostream>
#include <string>
class X {};
template<typename T>
inline auto foo(T && rhs) -> decltype(foohelper(std::forward<T>(rhs), 0)) {
return foohelper(std::forward<T>(rhs), 0);
}
template<typename T>
inline auto foohelper(T && rhs, int) -> decltype(fooimpl(std::forward<T>(rhs))) {
return fooimpl(std::forward<T>(rhs));
}
template<typename T>
inline std::string foohelper(T && rhs, long) {
return "bad";
}
inline std::string fooimpl(const X & rhs) {
return "good";
}
int main() {
std::cout << foo(X()) << std::endl;
X x;
std::cout << foo(x) << std::endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3RyaW5nPgoKY2xhc3MgWCB7fTsKCnRlbXBsYXRlPHR5cGVuYW1lIFQ+CmlubGluZSBhdXRvIGZvbyhUICYmIHJocykgLT4gZGVjbHR5cGUoZm9vaGVscGVyKHN0ZDo6Zm9yd2FyZDxUPihyaHMpLCAwKSkgewogICAgcmV0dXJuIGZvb2hlbHBlcihzdGQ6OmZvcndhcmQ8VD4ocmhzKSwgMCk7Cn0KCnRlbXBsYXRlPHR5cGVuYW1lIFQ+CmlubGluZSBhdXRvIGZvb2hlbHBlcihUICYmIHJocywgaW50KSAtPiBkZWNsdHlwZShmb29pbXBsKHN0ZDo6Zm9yd2FyZDxUPihyaHMpKSkgewogICAgcmV0dXJuIGZvb2ltcGwoc3RkOjpmb3J3YXJkPFQ+KHJocykpOwp9Cgp0ZW1wbGF0ZTx0eXBlbmFtZSBUPgppbmxpbmUgc3RkOjpzdHJpbmcgZm9vaGVscGVyKFQgJiYgcmhzLCBsb25nKSB7CiAgICByZXR1cm4gImJhZCI7Cn0KCmlubGluZSBzdGQ6OnN0cmluZyBmb29pbXBsKGNvbnN0IFggJiByaHMpIHsKICAgIHJldHVybiAiZ29vZCI7Cn0KCmludCBtYWluKCkgewogICAgc3RkOjpjb3V0IDw8IGZvbyhYKCkpIDw8IHN0ZDo6ZW5kbDsKICAgIFggeDsKICAgIHN0ZDo6Y291dCA8PCBmb28oeCkgPDwgc3RkOjplbmRsOwogICAgcmV0dXJuIDA7Cn0K