Advertisement
Guest User

Untitled

a guest
Oct 21st, 2019
94
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.68 KB | None | 0 0
  1. #include <boost/yap/expression.hpp>
  2. #include <boost/yap/print.hpp>
  3. #include <boost/yap/yap.hpp>
  4. #include <boost/hana/sum.hpp>
  5.  
  6. struct sum_int {
  7. // template<typename IntType, typename = std::enable_if_t<std::is_integral_v<IntType>, int>>
  8. // auto operator()(boost::yap::expr_tag<boost::yap::expr_kind::terminal>, IntType i) {
  9. // return i;
  10. // }
  11.  
  12. auto operator()(boost::yap::expr_tag<boost::yap::expr_kind::terminal>, int i) {
  13. return i;
  14. }
  15.  
  16. template<int I>
  17. auto operator()(boost::yap::expr_tag<boost::yap::expr_kind::terminal>, boost::hana::integral_constant<int, I> i) {
  18. return i;
  19. }
  20.  
  21. template<typename T>
  22. auto operator()(boost::yap::expr_tag<boost::yap::expr_kind::terminal>, T &&) {
  23. return boost::hana::int_c<0>;
  24. }
  25.  
  26. template<boost::yap::expr_kind Kind, typename ... Args>
  27. auto operator()(boost::yap::expr_tag<Kind> expr_tag, Args &&... args) {
  28. return boost::hana::sum<>(
  29. boost::hana::make_tuple(
  30. boost::yap::transform(
  31. boost::yap::as_expr(std::forward<Args>(args)),
  32. sum_int{})...
  33. ));
  34. }
  35. };
  36.  
  37.  
  38. int main() {
  39. auto expr1 = boost::yap::make_terminal(boost::hana::int_c<7>);
  40. auto expr2 = boost::yap::make_terminal(19);
  41. auto expr3 = boost::yap::make_terminal(true);
  42. using value_type = boost::hana::integral_constant<int, 7>::value_type;
  43.  
  44. auto expr = expr1 + expr1 + expr3;
  45.  
  46. boost::yap::print(std::cout, expr);
  47. auto expr_t = boost::yap::transform(expr, sum_int{});
  48.  
  49. boost::yap::print(std::cout, boost::yap::make_terminal(expr_t));
  50. std::cout << expr_t << std::endl;
  51.  
  52. return 0;
  53. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement