fork(1) download
  1. #include <iostream>
  2. #include <utility>
  3.  
  4. template <typename T, typename = size_t>
  5. struct HasField_abc : std::false_type { };
  6.  
  7. template <typename T>
  8. struct HasField_abc<T, decltype(sizeof(std::declval<T>().abc))> : std::true_type { };
  9.  
  10. template <typename T>
  11. std::enable_if_t<HasField_abc<T>::value> get(T&)
  12. {
  13. std::cout << "Has abc" << std::endl;
  14. // . . .
  15. }
  16.  
  17. template <typename T>
  18. std::enable_if_t<!HasField_abc<T>::value> get(T&)
  19. {
  20. std::cout << "Has no abc" << std::endl;
  21. // . . .
  22. }
  23.  
  24. struct Foo
  25. {
  26. std::string abc;
  27. };
  28.  
  29. struct Bar
  30. {
  31. std::string ab;
  32. };
  33.  
  34. int main()
  35. {
  36. Foo foo;
  37. get(foo); // Has abc
  38.  
  39. Bar bar;
  40. get(bar); // Has no abc
  41.  
  42. int i;
  43. get(i); // Has no abc
  44. }
Success #stdin #stdout 0s 16064KB
stdin
Standard input is empty
stdout
Has abc
Has no abc
Has no abc