fork download
  1. #include <utility>
  2. #include <iostream>
  3.  
  4. auto tuple = [](auto... args) { return [=](auto f) { return f(args...); }; };
  5.  
  6. auto map = [](auto... args) {
  7. return [=](auto f) { return tuple(f(args)...); };
  8. };
  9.  
  10. auto cat_raw = [](auto... largs) {
  11. return [=](auto... rargs) { return tuple(largs..., rargs...); };
  12. };
  13.  
  14. auto rcat = [](auto... largs) {
  15. return [=](auto rhs) { return rhs(cat_raw)(largs...); };
  16. };
  17.  
  18. auto print_tuple = [](auto t) {
  19. return t(map)([](auto e) {
  20. std::cout << e << " ";
  21. return e;
  22. });
  23. };
  24.  
  25. class olo {
  26. // olo(const& olo) = delete;
  27. public:
  28. olo() {}
  29. operator const char*() { return "olo"; }
  30. };
  31.  
  32. int main() {
  33. auto t = tuple(5u, 6, 7l, 8.0, olo())(rcat)(tuple(1u, 2, 3l, 4.0));
  34.  
  35. print_tuple(t);
  36. }
Success #stdin #stdout 0s 3456KB
stdin
Standard input is empty
stdout
olo 8 7 6 5 4 3 2 1