fork download
  1. #include <vector>
  2. #include <iostream>
  3.  
  4. /////////////////////////////////////////////////////////////////////////////
  5. // Data struct
  6. /////////////////////////////////////////////////////////////////////////////
  7.  
  8. struct point {
  9. point(int x, int y):x(x), y(y) {}
  10. int x, y ;
  11. } ;
  12.  
  13. /////////////////////////////////////////////////////////////////////////////
  14. // Specialized access function template
  15. /////////////////////////////////////////////////////////////////////////////
  16.  
  17. namespace tag{
  18. struct x{};
  19. struct y{};
  20. }
  21.  
  22. template <typename T> int& access(point& p) ;
  23. template <> int& access<tag::x>(point& p) { return p.x ; }
  24. template <> int& access<tag::y>(point& p) { return p.y ; }
  25.  
  26. template <typename T>
  27. int max ( std::vector<point>& v) {
  28. int result = access<T>(v[0]) ;
  29. for ( std::vector<point>::size_type i = 1; i != v.size(); ++i )
  30. if(access<T>(v[i]) > result)
  31. result = access<T>(v[i]) ;
  32. return result ;
  33. }
  34.  
  35. /////////////////////////////////////////////////////////////////////////////
  36. // main
  37. /////////////////////////////////////////////////////////////////////////////
  38.  
  39. int main()
  40. {
  41. std::vector<point> v ;
  42. v.push_back(point(1, 9));
  43. v.push_back(point(2, 8));
  44. v.push_back(point(3, 7));
  45. v.push_back(point(4, 6));
  46. v.push_back(point(5, 5));
  47.  
  48. // Specialized access function template
  49. std::cout << max<tag::x>(v) << std::endl ;
  50. std::cout << max<tag::y>(v) << std::endl ;
  51. }
Success #stdin #stdout 0.01s 2856KB
stdin
Standard input is empty
stdout
5
9