Boost.ScopeGuard
- Boost.MultiIndexにこっそりある。Vaultにもある
- おおもとの解説。 こんなものも。
Type ErasureとRAIIの二つをからめたテクニックBoost.ForeachはType Erasureにのみ使っているようだ
汎用的なRAII担当の型はauto_ptr等とは違って複雑になってしまうのでType Erasureを使うしかも、const参照の特徴を利用して、すると、newやvirtualを使うのを避けられるType Erasureのようなテクニックを使う必要がない
- 失敗した場合の処理を宣言時に与えておき、うまくいったらその処理をするまえに解雇する
- try部よりcatch部の方が先に書かれていることになる
- 失敗したら即returnできるので入れ子がなくなり読みやすくなる
- ScopeGuardのように汎用的に作らなくても、一連の作業に成功したら「解雇する」というクラスはコードをシンプルにする
[]#include[] []<vector>[]
[]#include[] []<boost/multi_index/detail/scope_guard.hpp>[]
[]using[] []boost[][]::[][]multi_index[][]::[][]detail[][]::[][]scope_guard[][];[]
[]using[] []boost[][]::[][]multi_index[][]::[][]detail[][]::[][]make_obj_guard[][];[][]class[] []my_container[]
[]{[]
[]std[][]::[][]vector[][]<[][]int[][]> [][]vec[][];[]
[]std[][]::[][]vector[][]<[][]int[][]*> [][]ptr_vec[][];[]
[]public[][]:[]
[]void[] []add[][]([][]int[] []x[][])[]
[] {[]
[]vec[][].[][]push_back[][]([][]x[][]);[]
[]scope_guard[] []guard[][] = [][]make_obj_guard[][]([][]vec[][], &[][]std[][]::[][]vector[][]<[][]int[][]>::[][]pop_back[][]);[]
[]ptr_vec[][].[][]push_back[][](&[][]vec[][].[][]back[][]());[]
[]guard[][].[][]dismiss[][]();[]
[] }[]
[]};[]