Taraxacum

模板元编程:编译期直接选择排序

Feb 25th, 2021 (edited)
436
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.03 KB | None | 0 0
  1. #include <iostream>
  2.  
  3. /******** list ****************************************************************/
  4.  
  5. template <typename T, T... xs>
  6. struct List
  7. {
  8. };
  9.  
  10. /******** print ***************************************************************/
  11.  
  12. template <typename T, T x0, T... xs>
  13. void print(List<T, x0, xs...>)
  14. {
  15.     std::cout << x0 << ' ';
  16.     print(List<T, xs...>{});
  17. }
  18.  
  19. template <typename T>
  20. void print(List<T>)
  21. {
  22.     std::cout << std::endl;
  23. }
  24.  
  25. /******** concat **************************************************************/
  26.  
  27. template <typename T, class L1, class L2>
  28. struct Concat;
  29.  
  30. template <typename T, T... xs1, T... xs2>
  31. struct Concat<T, List<T, xs1...>, List<T, xs2...>>
  32. {
  33.     using val = List<T, xs1..., xs2...>;
  34. };
  35.  
  36. /******** conditional expression **********************************************/
  37.  
  38. template <typename T, bool predicate, T consequence, T alternative>
  39. struct Conditional;
  40.  
  41. template <typename T, T consequence, T alternative>
  42. struct Conditional<T, true, consequence, alternative>
  43. {
  44.     static const T val = consequence;
  45. };
  46.  
  47. template <typename T, T consequence, T alternative>
  48. struct Conditional<T, false, consequence, alternative>
  49. {
  50.     static const T val = alternative;
  51. };
  52.  
  53. /******** pop_min *************************************************************/
  54.  
  55. template <typename T, class L>
  56. struct PopMin;
  57.  
  58. template <typename T, T x0, T x1>
  59. struct PopMin<T, List<T, x0, x1>>
  60. {
  61.     using remains = List<T, Conditional<T, (x0 < x1), x1, x0>::val>;
  62.     static const T min = Conditional<T, (x0 < x1), x0, x1>::val;
  63. };
  64.  
  65. template <typename T, T x0, T... xs>
  66. struct PopMin<T, List<T, x0, xs...>>
  67. {
  68.     using _tail = PopMin<T, List<T, xs...>>;
  69.     using remains = typename Concat<
  70.         T,
  71.         List<T, Conditional<T, (x0 < _tail::min), _tail::min, x0>::val>,
  72.         typename _tail::remains>::val;
  73.     static const T min = Conditional<T, (x0 < _tail::min), x0, _tail::min>::val;
  74. };
  75.  
  76. /******** Sorted **************************************************************/
  77.  
  78. template <typename T, class L>
  79. struct Sorted;
  80.  
  81. template <typename T, T x0, T x1>
  82. struct Sorted<T, List<T, x0, x1>>
  83. {
  84.     using result = List<
  85.         T,
  86.         Conditional<T, (x0 < x1), x0, x1>::val,
  87.         Conditional<T, (x0 < x1), x1, x0>::val>;
  88. };
  89.  
  90. template <typename T, T x0, T... xs>
  91. struct Sorted<T, List<T, x0, xs...>>
  92. {
  93.     using _tail = PopMin<T, List<T, xs...>>;
  94.  
  95.     using _remains = typename Sorted<
  96.         T,
  97.         typename Concat<
  98.             T,
  99.             List<T, Conditional<T, (x0 < _tail::min), _tail::min, x0>::val>,
  100.             typename _tail::remains>::val>::result;
  101.  
  102.     using result = typename Concat<
  103.         T,
  104.         List<T, Conditional<T, (x0 < _tail::min), x0, _tail::min>::val>,
  105.         _remains>::val;
  106. };
  107.  
  108. /******** main ****************************************************************/
  109.  
  110. int main(int argc, char const *argv[])
  111. {
  112.     using list = List<int, 7, 45, 2, 2, 4, 6, 3, 12, 4>;
  113.     using sorted = Sorted<int, list>;
  114.  
  115.     print(sorted::result{});
  116.  
  117.     return 0;
  118. }
  119.  
Add Comment
Please, Sign In to add comment