fork download
  1. #include <iostream>
  2.  
  3. template <size_t sz>
  4. struct S {};
  5.  
  6. template <typename T>
  7. void overload_notypename (T x, S<sizeof(T::a)> y) { std::cout << "one\n"; }
  8. template <typename T>
  9. void overload_notypename (T x, ...) { std::cout << "two\n"; }
  10.  
  11. template <typename T>
  12. void overload_typename (T x, S<sizeof(typename T::a)> y) { std::cout << "one\n"; }
  13. template <typename T>
  14. void overload_typename (T x, ...) { std::cout << "two\n"; }
  15.  
  16. template <typename T>
  17. void overload_notemplate (T x, S<sizeof(T::a<3>(5))> y) { std::cout << "one\n"; }
  18. template <typename T>
  19. void overload_notemplate (T x, ...) { std::cout << "two\n"; }
  20.  
  21. template <typename T>
  22. void overload_template (T x, S<sizeof(T::template a<3>(5))> y) { std::cout << "one\n"; }
  23. template <typename T>
  24. void overload_template (T x, ...) { std::cout << "two\n"; }
  25.  
  26. struct K
  27. {
  28. typedef int a;
  29. };
  30.  
  31. struct W
  32. {
  33. static const int a = 3;
  34. };
  35.  
  36. struct Z
  37. {
  38. template<int> static bool a(int) { return true; }
  39. };
  40.  
  41. int main ()
  42. {
  43. overload_notypename(K(), S<sizeof(int)>());
  44. overload_typename(K(), S<sizeof(int)>());
  45.  
  46. overload_notypename(W(), S<sizeof(int)>());
  47. overload_typename(W(), S<sizeof(int)>());
  48.  
  49. overload_notemplate(W(), S<sizeof(bool)>());
  50. // overload_template(W(), S<sizeof(bool)>());
  51.  
  52. overload_notemplate(Z(), S<sizeof(bool)>());
  53. overload_template(Z(), S<sizeof(bool)>());
  54. }
Success #stdin #stdout 0s 3296KB
stdin
Standard input is empty
stdout
two
one
one
two
one
two
one