fork download
  1. #include <iostream>
  2. #include <type_traits>
  3. #include <utility>
  4.  
  5. // Utility
  6. template <typename T, typename Result = void>
  7. struct enable: std::enable_if< std::is_same<T, std::true_type>::value > {};
  8.  
  9. template <typename T, typename Result = void>
  10. struct disable: std::enable_if< not std::is_same<T, std::true_type>::value > {};
  11.  
  12. // Hook
  13. std::false_type has_specific_foo(...);
  14.  
  15. template <typename T>
  16. auto foo(T const& t) -> typename disable<decltype(has_specific_foo(t))>::type {
  17. std::cerr << "Generic case\n";
  18. }
  19.  
  20. struct A{};
  21.  
  22. void foo(A const&) { std::cerr << "A\n"; }
  23. std::true_type has_specific_foo(A const&);
  24.  
  25. struct B: A{};
  26.  
  27. int main() {
  28. B b;
  29. foo(b);
  30. }
Success #stdin #stdout 0s 2824KB
stdin
Standard input is empty
stdout
Standard output is empty