Guest User

Untitled

a guest
Oct 23rd, 2018
91
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.40 KB | None | 0 0
  1. #include <type_traits>
  2.  
  3. struct identity {};
  4.  
  5. template< typename... Ts > struct type_list;
  6.  
  7. template< int N, typename C >
  8. struct dispatch;
  9.  
  10. template<>
  11. struct dispatch< 1, identity >
  12. {
  13. template< typename T >
  14. using f = T;
  15. };
  16.  
  17. template< template< typename... > class F, typename C = identity >
  18. struct promote {};
  19.  
  20. template< int N, template< typename... > class F, typename C >
  21. struct dispatch< N, promote< F, C > >
  22. {
  23. template< typename... Ts >
  24. using f = typename dispatch< 1, C >::template f< F< Ts... > >;
  25. };
  26.  
  27. using listify = promote< type_list >;
  28.  
  29. template< bool C >
  30. struct cond
  31. {
  32. template< typename T, typename F >
  33. using value_type = T;
  34. };
  35.  
  36. template<>
  37. struct cond< false >
  38. {
  39. template< typename T, typename F >
  40. using value_type = F;
  41. };
  42.  
  43. template< typename F, typename... Ts >
  44. using call_f = typename dispatch< sizeof...( Ts ), F >::template f< Ts... >;
  45.  
  46. template< typename T >
  47. void test();
  48.  
  49. template< typename T >
  50. using is_int = std::is_same< T, int >;
  51.  
  52. template< typename T, typename C = listify >
  53. struct append
  54. {
  55. };
  56.  
  57. template< typename T, typename C = listify >
  58. struct nop
  59. {
  60. };
  61.  
  62. template< int N, typename T, typename C >
  63. struct dispatch< N, nop< T, C > >
  64. {
  65. template< typename... Ts >
  66. using f = typename dispatch< sizeof...( Ts ), C >::template f< Ts... >;
  67. };
  68.  
  69. template< int N, typename T, typename C >
  70. struct dispatch< N, append< T, C > >
  71. {
  72. template< typename... Ts >
  73. using f = typename dispatch< sizeof...( Ts ) + 1, C >::template f< Ts..., T >;
  74. };
  75.  
  76. template< template< typename > class F, typename C = listify > struct find_if
  77. {
  78. };
  79.  
  80. template< typename C, typename... Ts2 >
  81. struct callify {};
  82.  
  83. template< int N, typename C, typename... Ts2 >
  84. struct dispatch< N, callify< C, Ts2... > >
  85. {
  86. template< typename... Ts >
  87. using f = typename dispatch< sizeof...( Ts ), C >::template f< typename dispatch< 1, Ts >::template f< Ts2 >... >;
  88. };
  89.  
  90. template< template< typename > class F, typename C >
  91. struct dispatch< 2, find_if< F, C > >
  92. {
  93. template< typename T0, typename T1 >
  94. using f = typename dispatch< 2, callify< C, T0, T1 > >::template f<
  95. typename cond< F< T0 >::value >::template value_type< promote< append, identity >, promote< nop, identity > >,
  96. typename cond< F< T1 >::value >::template value_type< promote< append, identity >, promote< nop, identity > >
  97. >;
  98. };
  99.  
  100. // < append< H, < find_if< > >
  101.  
  102. int main()
  103. {
  104. using t = call_f< find_if< is_int >, int, char >;
  105. test< t >();
  106. }
Add Comment
Please, Sign In to add comment