ScropeGard:安全に資源を整理する



     : 
http://blog.csdn.net/pongba/article/details/7911997

// TestScopeGuard01.cpp :              。
//

#include "stdafx.h"
#include 

namespace hh {
    class ScopeGuard
    {
    public:
        explicit ScopeGuard(std::function<void()> onExitScope)
            : onExitScope_(onExitScope), dismissed_(false)
        { }

        ~ScopeGuard()
        {
            if (!dismissed_)
            {
                onExitScope_();
            }
        }

        void Dismiss()
        {
            dismissed_ = true;
        }

    private:
        std::function<void()> onExitScope_;
        bool dismissed_;

    private: // noncopyable
        ScopeGuard(ScopeGuard const&);
        ScopeGuard& operator=(ScopeGuard const&);
    };
#define SCOPEGUARD_LINENAME_CAT(name, line) name##line
#define SCOPEGUARD_LINENAME(name, line) SCOPEGUARD_LINENAME_CAT(name, line)

#define ON_SCOPE_EXIT(callback) ScopeGuard SCOPEGUARD_LINENAME(EXIT, __LINE__)(callback)
}


int main()
{
    using namespace hh;
    try {

        //ON_SCOPE_EXIT([]() {printf("    ,    \r
"); });
ScopeGuard onExit([]() {printf(" , \r
"
); }); //throw 1; // , onExit.Dismiss(); } catch (...) { } return 0; }