Advertisement
Guest User

Untitled

a guest
May 24th, 2019
103
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.60 KB | None | 0 0
  1. #include <shogun/lib/any.h>
  2. #include <iostream>
  3. #include <vector>
  4.  
  5. using namespace shogun;
  6.  
  7. /**
  8. *
  9. */
  10. template <typename T>
  11. struct generic_checker
  12. {
  13. public:
  14. generic_checker(T val): m_val(val) {};
  15. bool operator()(T val) {return check(val);};
  16.  
  17. protected:
  18. T m_val;
  19. virtual bool check(T val) = 0;
  20. };
  21.  
  22. template <typename T>
  23. struct less_than: generic_checker<T>
  24. {
  25. public:
  26. less_than(T val): generic_checker<T>(val) {};
  27. protected:
  28. bool check(T val) override {return val < this->m_val;}
  29. };
  30.  
  31. template <typename T>
  32. struct greater_than: generic_checker<T>
  33. {
  34. public:
  35. greater_than(T val): generic_checker<T>(val) {};
  36. protected:
  37. bool check(T val) override {return val > this->m_val;}
  38. };
  39.  
  40. template <typename T = double>
  41. struct positive: greater_than<T>
  42. {
  43. public:
  44. positive(): greater_than<T>(0) {};
  45. };
  46.  
  47. template <typename T = double>
  48. struct negative: less_than<T>
  49. {
  50. public:
  51. negative(): less_than<T>(0) {};
  52. };
  53.  
  54. struct None
  55. {
  56. };
  57.  
  58. template <typename... Args>
  59. struct Types
  60. {
  61. using Head = None;
  62. static constexpr int size = 0;
  63. };
  64.  
  65. template <typename T1, typename... Args>
  66. struct Types<T1, Args...> : Types<Args...>
  67. {
  68. using Tail = Types<Args...>;
  69. using Head = T1;
  70. static constexpr int size = sizeof...(Args) + 1;
  71. };
  72.  
  73. template <typename T>
  74. struct is_type : std::false_type {};
  75.  
  76. template <typename ...Args>
  77. struct is_type<Types<Args...>> : std::true_type {};
  78.  
  79. // template <template <typename,typename> class Container, typename element, typename Allocator>
  80. // double apply(Container<element, Allocator> & a)
  81. // {
  82. // return 1;
  83. // }
  84.  
  85. template<typename T1, typename T2, std::enable_if_t<std::is_same_v<typename T1::Head, None>>* = nullptr>
  86. bool apply_helper(T2 val)
  87. {
  88. return true;
  89. }
  90.  
  91. template<typename T1, typename T2, std::enable_if_t<!std::is_same_v<typename T1::Head, None>>* = nullptr>
  92. bool apply_helper(T2 val)
  93. {
  94. return typename T1::Head{}(val) && apply_helper<typename T1::Tail>(val);
  95. }
  96.  
  97. template <typename T1, typename T2, std::enable_if_t<is_type<T1>::value>* = nullptr>
  98. bool apply(T2 val)
  99. {
  100. return apply_helper<T1>(val);
  101. }
  102.  
  103. template<typename ...Args>
  104. struct real
  105. {
  106. using funcs = Types<Args...>;
  107. real()
  108. {
  109. };
  110. real(double val)
  111. {
  112. if (apply<funcs>(val))
  113. m_val = val;
  114. };
  115. real& operator=(double val)
  116. {
  117. if (apply<funcs>(val))
  118. m_val = val;
  119. return *this;
  120. }
  121. double m_val;
  122. };
  123.  
  124. int main(int argc, char **argv)
  125. {
  126. real<positive<double>> x;
  127. x = -1;
  128. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement