fork download
  1. #include<iostream>
  2. using namespace std;
  3.  
  4. template<typename ClassName, typename ClassMethodType>
  5. struct HasMethod
  6. {
  7. template<typename Type, Type Object>
  8. struct Contains;
  9.  
  10. template<typename Class, typename MethodType>
  11. static char Check (Contains<MethodType, &Class::size>*);
  12. template<typename Class, typename MethodType>
  13. static long Check (...);
  14.  
  15. static const bool value = (sizeof(Check<ClassName,ClassMethodType>(0)) == sizeof(char));
  16. };
  17.  
  18. struct X {
  19. size_t size () const { return 0; }
  20. };
  21. struct Y {
  22. size_t size () { return 0; }
  23. };
  24. struct Z {
  25. size_t size__ () { return 0; }
  26. };
  27.  
  28. int main ()
  29. {
  30. cout << "HasMethod<X,size_t (X::*)() const>::value = " << HasMethod<X,size_t (X::*)() const>::value << endl;
  31. cout << "HasMethod<X,size_t (Y::*)() const>::value = " << HasMethod<Y,size_t (Y::*)() const>::value << endl;
  32. cout << "HasMethod<X,size_t (Z::*)() const>::value = " << HasMethod<Z,size_t (Z::*)() const>::value << endl;
  33. }
  34.  
Success #stdin #stdout 0.02s 2724KB
stdin
Standard input is empty
stdout
HasMethod<X,size_t (X::*)() const>::value = 1
HasMethod<X,size_t (Y::*)() const>::value = 0
HasMethod<X,size_t (Z::*)() const>::value = 0