fork download
  1. #include <iostream>
  2. #include <string>
  3. using namespace std;
  4.  
  5. template <class A, class B>
  6. void foo_imp(A& a, B& b, long x)
  7. {
  8. cout << "generic fallback" << endl;
  9. }
  10.  
  11. template <class A>
  12. void foo_imp(A& a, int& i, long x)
  13. {
  14. cout << "generic int" << endl;
  15. }
  16.  
  17. template <class A>
  18. void foo_imp(A& a, string& s, long x)
  19. {
  20. cout << "generic str" << endl;
  21. }
  22.  
  23. struct mine
  24. {
  25. int is_special;
  26. };
  27.  
  28. template <class A, class B>
  29. auto foo_imp(A& a, B& b, int x) -> decltype(A::is_special, void())
  30. {
  31. cout << "specialized fallback" << endl;
  32. }
  33.  
  34. template <class A, class B>
  35. auto foo(A& a, B& b) -> decltype(foo_imp(a, b, 0), void())
  36. {
  37. foo_imp(a, b, 0);
  38. }
  39.  
  40. int main() {
  41. int x;
  42. string y;
  43. float z;
  44. string generic;
  45. mine special;
  46.  
  47. foo(generic, x);
  48. foo(generic, y);
  49. foo(generic, z);
  50. foo(special, x);
  51. foo(special, y);
  52. foo(special, z);
  53.  
  54. return 0;
  55. }
Success #stdin #stdout 0s 3140KB
stdin
Standard input is empty
stdout
generic int
generic str
generic fallback
specialized fallback
specialized fallback
specialized fallback