#include<iostream>
using namespace std;
template<typename ClassName, typename ClassMethodType>
struct HasMethod
{
template<typename Type, Type Object>
struct Contains;
template<typename Class, typename MethodType>
static char Check (Contains<MethodType, &Class::size>*);
template<typename Class, typename MethodType>
static long Check (...);
static const bool value = (sizeof(Check<ClassName,ClassMethodType>(0)) == sizeof(char));
};
struct X {
size_t size () const { return 0; }
};
struct Y {
size_t size () { return 0; }
};
struct Z {
size_t size__ () { return 0; }
};
int main ()
{
cout << "HasMethod<X,size_t (X::*)() const>::value = " << HasMethod<X,size_t (X::*)() const>::value << endl;
cout << "HasMethod<X,size_t (Y::*)() const>::value = " << HasMethod<Y,size_t (Y::*)() const>::value << endl;
cout << "HasMethod<X,size_t (Z::*)() const>::value = " << HasMethod<Z,size_t (Z::*)() const>::value << endl;
}
I2luY2x1ZGU8aW9zdHJlYW0+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7Cgp0ZW1wbGF0ZTx0eXBlbmFtZSBDbGFzc05hbWUsIHR5cGVuYW1lIENsYXNzTWV0aG9kVHlwZT4Kc3RydWN0IEhhc01ldGhvZAp7CiAgdGVtcGxhdGU8dHlwZW5hbWUgVHlwZSwgVHlwZSBPYmplY3Q+CiAgc3RydWN0IENvbnRhaW5zOwoKICB0ZW1wbGF0ZTx0eXBlbmFtZSBDbGFzcywgdHlwZW5hbWUgTWV0aG9kVHlwZT4KICBzdGF0aWMgY2hhciBDaGVjayAoQ29udGFpbnM8TWV0aG9kVHlwZSwgJkNsYXNzOjpzaXplPiopOwogIHRlbXBsYXRlPHR5cGVuYW1lIENsYXNzLCB0eXBlbmFtZSBNZXRob2RUeXBlPgogIHN0YXRpYyBsb25nIENoZWNrICguLi4pOwoKICBzdGF0aWMgY29uc3QgYm9vbCB2YWx1ZSA9IChzaXplb2YoQ2hlY2s8Q2xhc3NOYW1lLENsYXNzTWV0aG9kVHlwZT4oMCkpID09IHNpemVvZihjaGFyKSk7Cn07CgpzdHJ1Y3QgWCB7IAogIHNpemVfdCBzaXplICgpIGNvbnN0IHsgcmV0dXJuIDA7IH0KfTsKc3RydWN0IFkgewogIHNpemVfdCBzaXplICgpIHsgcmV0dXJuIDA7IH0KfTsKc3RydWN0IFogewogIHNpemVfdCBzaXplX18gKCkgeyByZXR1cm4gMDsgfQp9OwoKaW50IG1haW4gKCkKewogIGNvdXQgPDwgIkhhc01ldGhvZDxYLHNpemVfdCAoWDo6KikoKSBjb25zdD46OnZhbHVlID0gIiA8PCBIYXNNZXRob2Q8WCxzaXplX3QgKFg6OiopKCkgY29uc3Q+Ojp2YWx1ZSA8PCBlbmRsOwogIGNvdXQgPDwgIkhhc01ldGhvZDxYLHNpemVfdCAoWTo6KikoKSBjb25zdD46OnZhbHVlID0gIiA8PCBIYXNNZXRob2Q8WSxzaXplX3QgKFk6OiopKCkgY29uc3Q+Ojp2YWx1ZSA8PCBlbmRsOwogIGNvdXQgPDwgIkhhc01ldGhvZDxYLHNpemVfdCAoWjo6KikoKSBjb25zdD46OnZhbHVlID0gIiA8PCBIYXNNZXRob2Q8WixzaXplX3QgKFo6OiopKCkgY29uc3Q+Ojp2YWx1ZSA8PCBlbmRsOwp9Cg==