fork download
  1. template < typename T, typename M > struct cmp_mem_var_t
  2. {
  3. explicit cmp_mem_var_t( M T::*mv ) : mv(mv) {}
  4.  
  5. bool operator() ( const T& first, const T& second ) const
  6. { return first.*mv < second.*mv ; }
  7.  
  8. private: M T::*mv ;
  9. };
  10.  
  11. template < typename T, typename M > // syntactic sugar
  12. cmp_mem_var_t<T,M> compare( M T::*mv ) { return cmp_mem_var_t<T,M>(mv) ; }
  13.  
  14. template < typename T, typename R > struct cmp_mem_fun_t
  15. {
  16.  
  17. explicit cmp_mem_fun_t( R (T::*mfn)() const ) : mfn(mfn) {}
  18.  
  19. bool operator() ( const T& first, const T& second ) const
  20. { return (first.*mfn)() < (second.*mfn)() ; }
  21.  
  22. private: R (T::*mfn)() const ;
  23. };
  24.  
  25. template < typename T, typename R > // syntactic sugar
  26. cmp_mem_fun_t<T,R> compare( R (T::*mfn)() const ) { return cmp_mem_fun_t<T,R>(mfn) ; }
  27.  
  28. struct A { int n ; double v ; double foo() const { return n+v ; } };
  29.  
  30. #include <string>
  31. #include <cctype>
  32.  
  33. struct B
  34. {
  35. std::string s ;
  36. std::string bar() const
  37. {
  38. std::string t = s ;
  39. for( char& c : t ) c = std::toupper(c) ;
  40. return t ;
  41. }
  42. };
  43.  
  44. #include <algorithm>
  45. #include <iterator>
  46. #include <iostream>
  47.  
  48. int main() // simple test driver
  49. {
  50. A seq_a[] = { { 3, 3.3 }, { 5, 2.2 }, { 2, 6.6 }, { 7, 5.5 }, { 6, 1.1 } } ;
  51. const auto print_a = [&seq_a] ()
  52. {
  53. for( const A& a : seq_a ) std::cout << "A{ " << a.n << ", " << a.v << " } " ;
  54. std::cout << '\n' ;
  55. };
  56. print_a() ;
  57.  
  58. std::sort( std::begin(seq_a), std::end(seq_a), compare(&A::n) ) ;
  59. print_a() ;
  60.  
  61. std::sort( std::begin(seq_a), std::end(seq_a), compare(&A::v) ) ;
  62. print_a() ;
  63.  
  64. std::sort( std::begin(seq_a), std::end(seq_a), compare(&A::foo) ) ;
  65. print_a() ;
  66.  
  67. std::cout << '\n' ;
  68.  
  69. B seq_b[] = { { "mno" }, { "ghi" }, { "abc" }, { "JKL" }, { "DEF" } } ;
  70. const auto print_b = [&seq_b] ()
  71. {
  72. for( const B& b : seq_b ) std::cout << "B{ '" << b.s << "' } " ;
  73. std::cout << '\n' ;
  74. };
  75. print_b() ;
  76.  
  77. std::sort( std::begin(seq_b), std::end(seq_b), compare(&B::s) ) ;
  78. print_b() ;
  79.  
  80. std::sort( std::begin(seq_b), std::end(seq_b), compare(&B::bar) ) ;
  81. print_b() ;
  82. }
  83.  
Success #stdin #stdout 0s 3448KB
stdin
Standard input is empty
stdout
A{ 3, 3.3 }  A{ 5, 2.2 }  A{ 2, 6.6 }  A{ 7, 5.5 }  A{ 6, 1.1 }  
A{ 2, 6.6 }  A{ 3, 3.3 }  A{ 5, 2.2 }  A{ 6, 1.1 }  A{ 7, 5.5 }  
A{ 6, 1.1 }  A{ 5, 2.2 }  A{ 3, 3.3 }  A{ 7, 5.5 }  A{ 2, 6.6 }  
A{ 3, 3.3 }  A{ 6, 1.1 }  A{ 5, 2.2 }  A{ 2, 6.6 }  A{ 7, 5.5 }  

B{ 'mno' }  B{ 'ghi' }  B{ 'abc' }  B{ 'JKL' }  B{ 'DEF' }  
B{ 'DEF' }  B{ 'JKL' }  B{ 'abc' }  B{ 'ghi' }  B{ 'mno' }  
B{ 'abc' }  B{ 'DEF' }  B{ 'ghi' }  B{ 'JKL' }  B{ 'mno' }