AM Daemon ライブラリリファレンス
ScopeExit.h
[詳解]
1 /// @file
2 /// @brief スコープが外れた時に任意の処理を行うクラス ScopeExit のヘッダ。
3 ///
4 /// Copyright(C)SEGA
5 
6 #ifndef AMDAEMON_UTIL_SCOPEEXIT_H
7 #define AMDAEMON_UTIL_SCOPEEXIT_H
8 
9 #include "amdaemon/env.h"
10 
11 #include <functional>
12 #include <utility>
13 
14 namespace amdaemon
15 {
16 namespace util
17 {
18 /// @addtogroup g_util
19 /// @{
20 
21  /// @brief スコープが外れた時に任意の処理を行うクラス。
22  ///
23  /// 主に関数から抜ける際に特定の処理を確実に行わせたい場合に用いる。
24  ///
25  /// @code
26  /// bool func()
27  /// {
28  /// // 関数を抜ける際に解放処理が必要。
29  /// int* values = new int[100];
30  ///
31  /// // この関数から抜ける際、確実に values を解放する。
32  /// amdaemon::util::ScopeExit valuesDeleter = [values] { delete [] values; };
33  ///
34  /// // …中略…
35  ///
36  /// // ここで呼び出し元に処理を戻す際、 valuesDeleter のデストラクタが呼ばれ、
37  /// // その中で delete [] values; が行われる。
38  /// return true;
39  /// }
40  /// @endcode
41  class ScopeExit
42  {
43  public:
44  /// @brief コンストラクタ。
45  /// @param[in] exitFunc デストラクタで呼び出させる終了処理関数。
46  ScopeExit(std::function<void ()> exitFunc) : _exitFunc(exitFunc)
47  {
48  }
49 
50  /// @brief ムーブコンストラクタ。
51  /// @param[in] src ムーブ元。
52  ScopeExit(ScopeExit&& src) : _exitFunc(std::move(src._exitFunc))
53  {
54  // ムーブ元の関数を無効化する
55  src._exitFunc = std::function<void ()>();
56  }
57 
58  /// @brief デストラクタ。
59  ///
60  /// コンストラクタで渡した終了処理関数が呼び出される。
62  {
63  // ムーブによって無効化されている場合がある
64  if (_exitFunc)
65  {
66  _exitFunc();
67  }
68  }
69 
70  /// @brief ムーブ代入演算子のオーバロード。
71  /// @param[in] r 右辺値。
72  /// @return 自身の参照。
74  {
75  _exitFunc = std::move(r._exitFunc);
76 
77  // ムーブ元の関数を無効化する
78  r._exitFunc = std::function<void ()>();
79 
80  return *this;
81  }
82 
83  private:
84  std::function<void ()> _exitFunc; ///< 終了処理関数。
85 
86  private:
87  // コピー禁止
88  ScopeExit(const ScopeExit&); // 宣言のみ
89  ScopeExit& operator=(const ScopeExit&); // 宣言のみ
90  };
91 
92 /// @}
93 } // namespace util
94 } // namespace amdaemon
95 
96 #endif // AMDAEMON_UTIL_SCOPEEXIT_H
Definition: AccessCode.h:202
Daemonライブラリの環境定義を行うヘッダ。
スコープが外れた時に任意の処理を行うクラス。
Definition: ScopeExit.h:41
AM Daemon ライブラリクラス群の基底名前空間。
Definition: Log.h:13
ScopeExit(std::function< void()> exitFunc)
コンストラクタ。
Definition: ScopeExit.h:46
ScopeExit(ScopeExit &&src)
ムーブコンストラクタ。
Definition: ScopeExit.h:52
ScopeExit & operator=(ScopeExit &&r)
ムーブ代入演算子のオーバロード。
Definition: ScopeExit.h:73
‾ScopeExit()
デストラクタ。
Definition: ScopeExit.h:61