#include<iostream>
class WithMethod
{
public: int Method () const { return 1000; }
};
class NoMethod {};
template<typename Class>
class HasMember_Method
{
typedef char (&yes)[2];
template<typename> struct Exists;
template<typename V>
static yes CheckMember (Exists<decltype(&V::Method)>*);
template<typename>
static char CheckMember (...);
public:
static const bool value = (sizeof(CheckMember<Class>(0)) == sizeof(yes));
};
template<typename T>
void foo (const T* const p)
{
std::cout << "HasMember_Method<T>::value = " << HasMember_Method<T>::value << "\n";
}
int main()
{
WithMethod* pW = new WithMethod;
NoMethod* pN = new NoMethod;
foo(pW);
foo(pN);
delete pW; delete pN;
}
I2luY2x1ZGU8aW9zdHJlYW0+CgpjbGFzcyBXaXRoTWV0aG9kIAp7CnB1YmxpYzogaW50IE1ldGhvZCAoKSBjb25zdCB7IHJldHVybiAxMDAwOyB9Cn07CgpjbGFzcyBOb01ldGhvZCB7fTsKCnRlbXBsYXRlPHR5cGVuYW1lIENsYXNzPgpjbGFzcyBIYXNNZW1iZXJfTWV0aG9kCnsKICB0eXBlZGVmIGNoYXIgKCZ5ZXMpWzJdOwogICAgIAogIHRlbXBsYXRlPHR5cGVuYW1lPiBzdHJ1Y3QgRXhpc3RzOwogICAgIAogIHRlbXBsYXRlPHR5cGVuYW1lIFY+CiAgc3RhdGljIHllcyBDaGVja01lbWJlciAoRXhpc3RzPGRlY2x0eXBlKCZWOjpNZXRob2QpPiopOwogIHRlbXBsYXRlPHR5cGVuYW1lPgogIHN0YXRpYyBjaGFyIENoZWNrTWVtYmVyICguLi4pOwogICAgIApwdWJsaWM6IAogIHN0YXRpYyBjb25zdCBib29sIHZhbHVlID0gKHNpemVvZihDaGVja01lbWJlcjxDbGFzcz4oMCkpID09IHNpemVvZih5ZXMpKTsKfTsKCnRlbXBsYXRlPHR5cGVuYW1lIFQ+CnZvaWQgZm9vIChjb25zdCBUKiBjb25zdCBwKQp7CglzdGQ6OmNvdXQgPDwgIkhhc01lbWJlcl9NZXRob2Q8VD46OnZhbHVlID0gIiA8PCBIYXNNZW1iZXJfTWV0aG9kPFQ+Ojp2YWx1ZSA8PCAiXG4iOwp9CgppbnQgbWFpbigpCnsKCVdpdGhNZXRob2QqIHBXID0gbmV3IFdpdGhNZXRob2Q7CglOb01ldGhvZCogcE4gPSBuZXcgTm9NZXRob2Q7CgoJZm9vKHBXKTsKCWZvbyhwTik7CgoJZGVsZXRlIHBXOyBkZWxldGUgcE47Cn0KCg==