daskol

usage-example.cc

Aug 4th, 2018
112
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.22 KB | None | 0 0
  1. /**
  2.  *  \file usage-example.cc
  3.  */
  4.  
  5. #include <functional>
  6. #include <iostream>
  7. #include <string>
  8.  
  9. //  \brief Nursling is owned by nursery.
  10. class Nursling {
  11. public:
  12.     template<typename Fn, typename ...Args>
  13.     Nursling(Fn&& fn, Args&& ...args) noexcept
  14.     {
  15.         std::cerr << "Nursling()\n";
  16.     }
  17.  
  18.     ~Nursling(void) {
  19.         std::cerr << "~Nursling()\n";
  20.     }
  21. };
  22.  
  23. #define CACTUS_CONCAT_IMPL(a, b)    a##_##b
  24. #define CACTUS_CONCAT(a, b)         CACTUS_CONCAT_IMPL(a, b)
  25.  
  26. #if !defined(CACTUS_SALT)
  27. #define CACTUS_SALT 19a83b68886c9c991c8431ececb31092
  28. #endif
  29.  
  30. #if !defined(CACTUS_PREFIX)
  31. #define CACTUS_PREFIX   CACTUS_CONCAT(cactus_coro, 19a83b68886c9c991c8431ececb31092)
  32. #endif
  33.  
  34. #if !defined(CACTUS_SUFFIX)
  35. #define CACTUS_SUFFIX   CACTUS_CONCAT(__LINE__, __COUNTER__)
  36. #endif
  37.  
  38. #define CACTUS_IDENTIFIER       CACTUS_CONCAT(CACTUS_PREFIX, CACTUS_SUFFIX)
  39. #define CACTUS_GO(var, fn, ...) auto &&var = Nursling(fn, ##__VA_ARGS__)
  40.  
  41. #define Go(fn, ...)             CACTUS_GO(CACTUS_IDENTIFIER, fn, ##__VA_ARGS__)
  42.  
  43. int main() {
  44.     {
  45.         Go([&] () {}, 42, "hello, ", std::string("world!"));
  46.         std::cerr << "somewhere in the middle\n";
  47.     }
  48.     std::cerr << "out of scope\n";
  49.     return 0;
  50. }
Advertisement
Add Comment
Please, Sign In to add comment