Boost.ScopeGuard

  • Boost.MultiIndexにこっそりある。Vaultにもある
  • おおもとの解説こんなものも。
  • Type ErasureRAIIの二つをからめたテクニック
    • 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[][]();[]
[] }[]
[]};[]