(原創)用c 11實現簡潔的ScopeGuard

2021-09-06 12:40:35 字數 1152 閱讀 1209

scopeguard的作用是確保資源面對異常時總能被成功釋放,就算沒有正常返回。慣用法讓我們在建構函式裡獲取資源,當因為異常或者正常作用域結束,那麼在析構函式裡釋放資源。總是能釋放資源。如果沒有異常丟擲則正常結束,只是有異常發生或者沒有正常退出時釋放資源。關於scopegaurd的概念想多了解一點的童鞋點這裡和這裡。c#中的scopeguard比較簡單,通過using初始化或者通過finally就可以做到,c++中需要自己去實現。

c++中設計scopeguard的關鍵技術:通過區域性變數析構函式來管理資源,根據是否是正常退出來確定是否需要清理資源。用c++11做很簡單。

template class

scopeguard

explicit scopeguard(const f& f) : m_func(f), m_dismiss(false

){} ~scopeguard()

scopeguard(scopeguard &&rhs) : m_func(std::move(rhs.m_func)), m_dismiss(rhs.m_dismiss)

void

dismiss()

private

: f m_func;

bool

m_dismiss;

scopeguard();

scopeguard(

const scopeguard&);

scopeguard& operator=(const scopeguard&);

//template

//auto run(args&&... args)->typename std::result_of::type

//

};

template

scopeguard::type> makeguard(f && f)

測試**:

void

testscopeguard()

;

//正常退出

//異常退出

//非正常退出

}

通過測試程式可以知道,當程式沒有發生異常正常退出時,需要呼叫一下dismiss函式,以解除scopeguard,當程式異常退出時,會進入異常處理函式去釋放相應資源,實現scopeguard的目的。

C11簡潔之道 tupe元祖

tuple元組是乙個固定大小不同型別的值的集合,是泛化的std pair。我們也可以把它當作乙個通用的結構體來使用,不需要建立結構體有獲取結構體特徵,在某些情況可以取代結構體,使程式更簡潔 直觀。tuple在c 11中使用簡單,但是往往要和模板元的一些技巧結合使用。tuplechar int tp ...

C11簡潔之道 迴圈的改善

在c 98 03中,通過for迴圈對乙個容器進行遍歷,一般有兩種方法,常規的for迴圈,或者使用中的for each方法。for迴圈遍歷 void func void for each方法 void vfunccall int n void func2 void for each相比一般的for迴圈...

排序演算法 C 11的實現

近來在學習 這算是自娛自樂吧 這裡只考慮排序的物件的有move建構函式,move賦值函式。cpp view plain copy ifndef yyrsort h define yyrsort h include using namespace std const size t threshold ...