#include <iostream>
struct T1
{ };
struct T2
{ };
template<typename T>
struct has_print
{ typedef void no_t; };
template<>
struct has_print<void>
{ typedef void yes_t; };
template<typename T>
char print_type(T t);
void print_type(T1 t)
{ std::cout << "T1\n"; }
template<typename T>
auto print(T t) -> typename has_print<decltype(print_type(t))>::yes_t
{
print_type(t);
}
template<typename T>
auto print(T t) -> typename has_print<decltype(print_type(t))>::no_t
{
std::cout << "can't print this\n";
}
int main()
{
print(T1());
print(T2());
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKc3RydWN0IFQxCnsgfTsKCnN0cnVjdCBUMgp7IH07Cgp0ZW1wbGF0ZTx0eXBlbmFtZSBUPgpzdHJ1Y3QgaGFzX3ByaW50CnsgdHlwZWRlZiB2b2lkIG5vX3Q7IH07Cgp0ZW1wbGF0ZTw+CnN0cnVjdCBoYXNfcHJpbnQ8dm9pZD4KeyB0eXBlZGVmIHZvaWQgeWVzX3Q7IH07Cgp0ZW1wbGF0ZTx0eXBlbmFtZSBUPgpjaGFyIHByaW50X3R5cGUoVCB0KTsKCnZvaWQgcHJpbnRfdHlwZShUMSB0KQp7IHN0ZDo6Y291dCA8PCAiVDFcbiI7IH0KCnRlbXBsYXRlPHR5cGVuYW1lIFQ+CmF1dG8gcHJpbnQoVCB0KSAtPiB0eXBlbmFtZSBoYXNfcHJpbnQ8ZGVjbHR5cGUocHJpbnRfdHlwZSh0KSk+Ojp5ZXNfdAp7CiAgcHJpbnRfdHlwZSh0KTsKfQoKdGVtcGxhdGU8dHlwZW5hbWUgVD4KYXV0byBwcmludChUIHQpIC0+IHR5cGVuYW1lIGhhc19wcmludDxkZWNsdHlwZShwcmludF90eXBlKHQpKT46Om5vX3QKewogIHN0ZDo6Y291dCA8PCAiY2FuJ3QgcHJpbnQgdGhpc1xuIjsKfQoKaW50IG1haW4oKQp7CiAgcHJpbnQoVDEoKSk7CiAgcHJpbnQoVDIoKSk7Cn0K