fork download
  1. #include <functional>
  2.  
  3. template<class functionoid>
  4. class finally_type {
  5. public:
  6. template<class functionoid0>
  7. finally_type(functionoid0&& f) :func(std::forward<functionoid0>(f)) {}
  8. finally_type(finally_type&& rhs) :func(std::move(rhs.func)) {}
  9. finally_type(const finally_type& rhs) :func(rhs.func) {}
  10. finally_type& operator=(finally_type&& rhs) {func=std::move(rhs.func); return *this;}
  11. finally_type& operator=(const finally_type& rhs) {func=rhs.func; return *this;}
  12. ~finally_type() {func();}
  13. private:
  14. functionoid func;
  15. };
  16. template<class functionoid>
  17. inline finally_type<functionoid> finally(functionoid&& func)
  18. {return finally_type<functionoid>(std::forward<functionoid>(func));}
  19. template<class functionoid, class T0>
  20. inline auto finally(functionoid&& func, T0&& p0)
  21. ->decltype(finally(std::bind(std::forward<functionoid>(func), std::forward<T0>(p0))))
  22. {return finally(std::bind(std::forward<functionoid>(func), std::forward<T0>(p0)));}
  23. template<class functionoid, class T0, class T1>
  24. inline auto finally(functionoid&& func, T0&& p0, T1&& p1)
  25. ->decltype(finally(std::bind(std::forward<functionoid>(func), std::forward<T0>(p0), std::forward<T1>(p1))))
  26. {return finally(std::bind(std::forward<functionoid>(func), std::forward<T0>(p0), std::forward<T1>(p1)));}
  27. template<class functionoid, class T0, class T1, class T2>
  28. inline auto finally(functionoid&& func, T0&& p0, T1&& p1, T2&& p2)
  29. ->decltype(finally(std::bind(std::forward<functionoid>(func), std::forward<T0>(p0), std::forward<T1>(p1), std::forward<T2>(p2))))
  30. {return finally(std::bind(std::forward<functionoid>(func), std::forward<T0>(p0), std::forward<T1>(p1), std::forward<T2>(p2)));}
  31. template<class functionoid, class T0, class T1, class T2, class T3>
  32. inline auto finally(functionoid&& func, T0&& p0, T1&& p1, T2&& p2, T3&& p3)
  33. ->decltype(finally(std::bind(std::forward<functionoid>(func), std::forward<T0>(p0), std::forward<T1>(p1), std::forward<T2>(p2), std::forward<T3>(p3))))
  34. {return finally(std::bind(std::forward<functionoid>(func), std::forward<T0>(p0), std::forward<T1>(p1), std::forward<T2>(p2), std::forward<T2>(p3)));}
  35.  
  36.  
  37.  
  38.  
  39.  
  40.  
  41.  
  42.  
  43.  
  44. #include <iostream>
  45. int print(int i)
  46. {
  47. std::cout << i << ' ';
  48. return i;
  49. }
  50.  
  51. int main() {
  52. auto f = finally(print, 13);
  53. return print(0);
  54. }
Success #stdin #stdout 0s 2852KB
stdin
Standard input is empty
stdout
0 13