fork download
  1. #include <functional>
  2. #include <memory>
  3. #include <iostream>
  4. #include <queue>
  5.  
  6. template<class Sig>
  7. struct recursive;
  8. template<class R, class... As>
  9. struct recursive< R(As...) > {
  10. using base_type = std::function<R(recursive, As...)>;
  11. private:
  12. std::shared_ptr< base_type > base;
  13. public:
  14.  
  15. template<typename...Ts>
  16. auto operator()(Ts&&... ts) const
  17. -> typename std::result_of< base_type( recursive, Ts... ) >::type
  18. {
  19. return (*base)(*this, std::forward<Ts>(ts)...);
  20. }
  21.  
  22. recursive(recursive const&)=default;
  23. recursive(recursive&&)=default;
  24. recursive& operator=(recursive const&)=default;
  25. recursive& operator=(recursive &&)=default;
  26. recursive() = default;
  27. template<typename L, typename=typename std::result_of< L(recursive, As...) >::type>
  28. explicit recursive( L&& f ):
  29. base( std::make_shared<base_type>(std::forward<L>(f)))
  30. {}
  31. explicit operator bool() const { return base && *base; }
  32. };
  33.  
  34. typedef std::queue<std::function<void (void)>> my_queue;
  35.  
  36. std::function<void (int)> get_recursive_function(my_queue& queue) {
  37. my_queue* pqueue = &queue;
  38. // Closure to allow self-reference
  39. auto f = [pqueue](recursive<void(int)> self, int recurse) {
  40. std::cout << recurse << std::endl;
  41. if (recurse == 0)
  42. return;
  43. pqueue->push( [self,recurse](){ self(recurse-1); } );
  44. };
  45. return recursive<void(int)>( f );
  46. }
  47.  
  48. int main(int, char **) {
  49. my_queue queue;
  50. queue.push([&](){ get_recursive_function(queue)(10); } );
  51.  
  52. while (!queue.empty()) {
  53. queue.front()();
  54. queue.pop();
  55. }
  56. }
  57.  
Success #stdin #stdout 0s 3436KB
stdin
Standard input is empty
stdout
10
9
8
7
6
5
4
3
2
1
0