fork(1) download
  1. #include <iostream>
  2. #include <type_traits>
  3.  
  4. //this goes in some header so you can use it everywhere
  5. template<typename T>
  6. struct TypeSink{
  7. using Type = void;
  8. };
  9. template<typename T>
  10. using TypeSinkT = typename TypeSink<T>::Type;
  11.  
  12. //here is the use case
  13. template<typename T, typename = void>
  14. struct enable_if_has_bar{ };
  15.  
  16. template<typename T>
  17. struct enable_if_has_bar<T, TypeSinkT<decltype(std::declval<T&>().*(&T::bar))>>
  18. : std::decay<decltype(std::declval<T&>().*(&T::bar))>
  19. { };
  20.  
  21. struct S{
  22. int bar;
  23. };
  24. struct K{
  25.  
  26. };
  27.  
  28. template<typename T, typename = typename enable_if_has_bar<T>::type>
  29. void print(T){
  30. std::cout << "has bar" << std::endl;
  31. }
  32. void print(...){
  33. std::cout << "no bar" << std::endl;
  34. }
  35. static_assert(std::is_same<typename enable_if_has_bar<S>::type,int>::value,"");
  36.  
  37. int main(){
  38. print(S{});
  39. print(K{});
  40. }
Success #stdin #stdout 0s 3340KB
stdin
Standard input is empty
stdout
has bar
no bar