#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);
}