fork download
  1. #include <type_traits>
  2. #include <string>
  3.  
  4.  
  5. std::string fooImpl(int i) { return "int!"; }
  6.  
  7. template <typename T>
  8. void fooImpl(T);
  9.  
  10. template <typename T>
  11. using HasFooImpl = typename std::is_same<std::string, decltype(fooImpl(std::declval<T>()))>;
  12.  
  13. template <typename T>
  14. typename std::enable_if<HasFooImpl<T>::value, std::string>::type
  15. foo(T&& t)
  16. {
  17. return fooImpl(std::forward<T>(t));
  18. }
  19.  
  20. template <typename T>
  21. typename std::enable_if<!HasFooImpl<T>::value, std::string>::type
  22. foo(T&& t)
  23. {
  24. return "generic!";
  25. }
  26.  
  27. struct X{};
  28.  
  29. template <class T>
  30. struct S{};
  31. template <class T>
  32. std::string fooImpl(S<T> const&) { return "S<T>"; }
  33.  
  34. #include <iostream>
  35. int main()
  36. {
  37. std::cout << foo(1) << '\n';
  38. std::cout << foo("nope") << '\n';
  39. std::cout << foo(S<unsigned>{}) << '\n';
  40. std::cout << foo(X{}) << '\n';
  41. std::cout << foo(3.4) << '\n'; //will call fooImpl(int)
  42. }
Success #stdin #stdout 0s 2984KB
stdin
Standard input is empty
stdout
int!
generic!
S<T>
generic!
generic!