#include<iostream>
class WithMethod
{
public: int Method () const { return 1000; }
};
class NoMethod {};
template<typename Class>
class HasMember_Method
{
typedef char (&yes)[2];
template<unsigned int> struct Exists;
template<typename V>
static yes CheckMember (Exists<sizeof(&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+CgpjbGFzcyBXaXRoTWV0aG9kIAp7CnB1YmxpYzogaW50IE1ldGhvZCAoKSBjb25zdCB7IHJldHVybiAxMDAwOyB9Cn07CgpjbGFzcyBOb01ldGhvZCB7fTsKCnRlbXBsYXRlPHR5cGVuYW1lIENsYXNzPgpjbGFzcyBIYXNNZW1iZXJfTWV0aG9kCnsKICB0eXBlZGVmIGNoYXIgKCZ5ZXMpWzJdOwogICAgIAogIHRlbXBsYXRlPHVuc2lnbmVkIGludD4gc3RydWN0IEV4aXN0czsKICAgICAKICB0ZW1wbGF0ZTx0eXBlbmFtZSBWPgogIHN0YXRpYyB5ZXMgQ2hlY2tNZW1iZXIgKEV4aXN0czxzaXplb2YoJlY6Ok1ldGhvZCk+Kik7CiAgdGVtcGxhdGU8dHlwZW5hbWU+CiAgc3RhdGljIGNoYXIgQ2hlY2tNZW1iZXIgKC4uLik7CiAgICAgCnB1YmxpYzogCiAgc3RhdGljIGNvbnN0IGJvb2wgdmFsdWUgPSAoc2l6ZW9mKENoZWNrTWVtYmVyPENsYXNzPigwKSkgPT0gc2l6ZW9mKHllcykpOwp9OwoKdGVtcGxhdGU8dHlwZW5hbWUgVD4Kdm9pZCBmb28gKGNvbnN0IFQqIGNvbnN0IHApCnsKCXN0ZDo6Y291dCA8PCAiSGFzTWVtYmVyX01ldGhvZDxUPjo6dmFsdWUgPSAiIDw8IEhhc01lbWJlcl9NZXRob2Q8VD46OnZhbHVlIDw8ICJcbiI7Cn0KCmludCBtYWluKCkKewoJV2l0aE1ldGhvZCogcFcgPSBuZXcgV2l0aE1ldGhvZDsKCU5vTWV0aG9kKiBwTiA9IG5ldyBOb01ldGhvZDsKCglmb28ocFcpOwoJZm9vKHBOKTsKCglkZWxldGUgcFc7IGRlbGV0ZSBwTjsKfQoK