#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;
}
