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