fork(1) download
  1. #include <type_traits>
  2. #include <iostream>
  3.  
  4. struct _test_print {
  5. template<class T> static auto test(T* p) -> decltype(p->print(), std::true_type());
  6. template<class> static auto test(...) -> std::false_type;
  7. };
  8. template<class T> struct has_print : public decltype(_test_print::test<T>(0)) {};
  9.  
  10.  
  11. template<typename T>
  12. auto print(T t) -> typename std::enable_if<has_print<T>::value, decltype(t.print())>::type {
  13. return t.print();
  14. }
  15.  
  16. template<typename T>
  17. auto print(T t) -> typename std::enable_if<!has_print<T>::value, T>::type {
  18. return t;
  19. }
  20.  
  21.  
  22. struct MyClass {
  23. std::string print() {
  24. return "I was printed using my custom print()!";
  25. }
  26. };
  27.  
  28. int main() {
  29. MyClass myobj;
  30. std::cout << print(42) << std::endl;
  31. std::cout << print(myobj) << std::endl;
  32. }
Success #stdin #stdout 0s 3028KB
stdin
Standard input is empty
stdout
42
I was printed using my custom print()!