#include <iostream>
static void _pass() {}
struct Iman
{
static void salam() {std::cout << "salam";}
};
template<typename Class>
struct HasSalam
{
typedef char _1Byte;
typedef struct { char a[2]; } _2Bytes;
template<typename __Class> static _1Byte Check(int __Class::*);
template<typename __Class> static _2Bytes Check(...);
enum { result = sizeof(HasSalam<Class>::Check<Class>(0)) == sizeof(_1Byte) };
};
template<bool N> struct IF
{
static constexpr int Result = 1;
template<class A> static void print()
{
A::salam();
}
};
template<> struct IF<false>
{
static constexpr int Result = 0;
template<class A> static void print()
{
_pass();
}
};
template<class T>
struct PrintIfHasSalamMethod
{
static void proceed()
{
IF<
HasSalam<T>::result
>::print<T>();
}
};
int main()
{
PrintIfHasSalamMethod<Iman>::proceed();
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKc3RhdGljIHZvaWQgX3Bhc3MoKSB7fQpzdHJ1Y3QgSW1hbgp7CiAgICBzdGF0aWMgdm9pZCBzYWxhbSgpIHtzdGQ6OmNvdXQgPDwgInNhbGFtIjt9Cn07Cgp0ZW1wbGF0ZTx0eXBlbmFtZSBDbGFzcz4Kc3RydWN0IEhhc1NhbGFtCnsKICAgIHR5cGVkZWYgY2hhciBfMUJ5dGU7CiAgICB0eXBlZGVmIHN0cnVjdCB7IGNoYXIgYVsyXTsgfSBfMkJ5dGVzOwogICAgdGVtcGxhdGU8dHlwZW5hbWUgX19DbGFzcz4gc3RhdGljIF8xQnl0ZSBDaGVjayhpbnQgX19DbGFzczo6Kik7CiAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfX0NsYXNzPiBzdGF0aWMgXzJCeXRlcyBDaGVjayguLi4pOwogICAgZW51bSB7IHJlc3VsdCA9IHNpemVvZihIYXNTYWxhbTxDbGFzcz46OkNoZWNrPENsYXNzPigwKSkgPT0gc2l6ZW9mKF8xQnl0ZSkgfTsKfTsKCnRlbXBsYXRlPGJvb2wgTj4gc3RydWN0IElGCnsKCXN0YXRpYyBjb25zdGV4cHIgaW50IFJlc3VsdCA9IDE7Cgl0ZW1wbGF0ZTxjbGFzcyBBPiBzdGF0aWMgdm9pZCBwcmludCgpCgl7CgkJQTo6c2FsYW0oKTsKCX0KfTsKdGVtcGxhdGU8PiBzdHJ1Y3QgSUY8ZmFsc2U+CnsKCXN0YXRpYyBjb25zdGV4cHIgaW50IFJlc3VsdCA9IDA7Cgl0ZW1wbGF0ZTxjbGFzcyBBPiBzdGF0aWMgdm9pZCBwcmludCgpCgl7CgkJX3Bhc3MoKTsKCX0KfTsKdGVtcGxhdGU8Y2xhc3MgVD4Kc3RydWN0IFByaW50SWZIYXNTYWxhbU1ldGhvZAp7CglzdGF0aWMgdm9pZCBwcm9jZWVkKCkKCXsKCQlJRjwKCQkJSGFzU2FsYW08VD46OnJlc3VsdAoJCT46OnByaW50PFQ+KCk7Cgl9Cn07CmludCBtYWluKCkKewogICAgUHJpbnRJZkhhc1NhbGFtTWV0aG9kPEltYW4+Ojpwcm9jZWVkKCk7Cn0K