fork download
  1. #include <type_traits>
  2. #include <utility>
  3. #include <iostream>
  4.  
  5.  
  6. template <typename...>
  7. using void_t = void;
  8.  
  9. template <typename T, template <typename> class D, typename = void>
  10. struct detect : std::false_type {};
  11.  
  12. template <typename T, template <typename> class D>
  13. struct detect<T, D, void_t<D<T>>> : std::true_type {};
  14.  
  15. template <typename T>
  16. using has_m = decltype(std::declval<T>().m());
  17.  
  18.  
  19. template<typename T>
  20. struct Derived : public T
  21. {
  22. void m(std::true_type) { T::m(); }
  23. void m(std::false_type) { std::cout<<"Derived\n"; }
  24. void m() { return m(detect<T, has_m>{}); }
  25. };
  26.  
  27. struct Base0 { };
  28. struct Base1 { void m() { std::cout<<"Base1\n"; } };
  29.  
  30. int main(){
  31. Derived<Base0> d0;
  32. d0.m(); //should print "Derived"
  33. Derived<Base1> d1;
  34. d1.m(); //should print "Base1"
  35. }
Success #stdin #stdout 0s 3460KB
stdin
Standard input is empty
stdout
Derived
Base1