fork download
  1. #include <type_traits>
  2. #include <iostream>
  3. #include <iomanip>
  4.  
  5. template <class...>
  6. using void_t = void;
  7.  
  8. template <class T, class = void>
  9. struct has_function_f : std::false_type
  10. {
  11. };
  12.  
  13. template <class T>
  14. struct has_function_f<T, void_t<decltype(std::declval<T>().f())>> : std::true_type
  15. {
  16. };
  17.  
  18.  
  19. struct A
  20. {
  21. void f() {}
  22. };
  23.  
  24. struct B
  25. {
  26. void g() {}
  27. };
  28.  
  29. struct C
  30. {
  31. int f() { return 1; }
  32. };
  33.  
  34. int main()
  35. {
  36. auto a = has_function_f<A>();
  37. auto b = has_function_f<B>();
  38. auto c = has_function_f<C>();
  39.  
  40. std::cout << std::boolalpha << "a: " << a.value << '\n' << "b: " << b.value << '\n' << "c: " << c.value << std::endl;
  41. }
  42.  
Success #stdin #stdout 0s 3412KB
stdin
Standard input is empty
stdout
a: true
b: false
c: true