fork download
  1. #include <iostream>
  2.  
  3. template <typename T>
  4. struct is_foo {
  5. private:
  6. template<typename U, U> struct helper{};
  7.  
  8. template <typename Z> static auto test(Z z) -> decltype(
  9.  
  10. helper<void (Z::*)() const, &Z::foo>(),
  11. // All other requirements follow..
  12.  
  13. std::true_type()
  14. );
  15.  
  16. template <typename> static auto test(...) -> std::false_type;
  17.  
  18. public:
  19. enum { value = std::is_same<decltype(test<T>(std::declval<T>())),std::true_type>::value };
  20. };
  21.  
  22. struct A {
  23. void foo() const;
  24. };
  25.  
  26. struct A1 : public A {};
  27.  
  28. struct B { void foo(); };
  29. struct C { int foo() const; };
  30.  
  31. template <typename T>
  32. struct D : public T {};
  33.  
  34. int main() {
  35. std::cout << "Good examples (should print 1)\n";
  36. std::cout << is_foo<A>::value << '\n';
  37. std::cout << is_foo<A1>::value << '\n';
  38. std::cout << is_foo<D<A>>::value << '\n';
  39. std::cout << is_foo<D<A1>>::value << '\n';
  40.  
  41. std::cout << "Bad examples (should print 0)\n";
  42. std::cout << is_foo<B>::value << '\n';
  43. std::cout << is_foo<C>::value << '\n';
  44. std::cout << is_foo<D<B>>::value << '\n';
  45. std::cout << is_foo<D<C>>::value << '\n';
  46.  
  47. return 0;
  48. }
  49.  
Success #stdin #stdout 0s 3296KB
stdin
Standard input is empty
stdout
Good examples (should print 1)
1
0
0
0
Bad examples (should print 0)
0
0
0
0