1 #ifndef GINTENLIB_INCLUDED_TYPED_SAVER_HPP_
2 #define GINTENLIB_INCLUDED_TYPED_SAVER_HPP_
6 <gintenlib/typed_saver.hpp>
8 typed_saver : デストラクタでの値の復帰(テンプレート版)
11 template< typename T >
12 class typed_saver : boost::noncopyable
16 explicit typed_saver( T& t );
21 // これを呼んでも、デストラクタでは再度値が巻き戻される
23 // これを呼ぶと、デストラクタで値が戻されることはなくなる
25 // invoke して release する
31 コンストラクタで受け取った変数の値を記録し、デストラクタで書き戻します。
32 value_saver と違い変数の型を指定する必要がありますが、その分高速に動作します。
34 詳しくは value_saver の項を確認して下さい。
37 typed_saver, value_saver を利用できるオブジェクトの条件は、
40 の2点です(version1.0.0で変更)。
41 また、例外を投げない swap() 関数呼び出しが存在すれば、例外安全です。
47 #include <boost/noncopyable.hpp>
48 #include <boost/utility/addressof.hpp>
52 // コンストラクタの時の値に、デストラクタで強制復帰させるオブジェクト
53 template< typename T >
55 : private boost::noncopyable
57 // t の値を記録し、デストラクタで巻き戻す
58 explicit typed_saver( T& t )
59 : target_( boost::addressof(t) ), saver_(t) {}
62 ~typed_saver() { reset(); }
65 // この呼出が行われたとしても、デストラクタでは再度 値の復帰が行われる
79 // 明示的に復帰してから release する
85 swap( *target_, saver_ );
94 }; // class typed_saver<T>
96 } // namespace gintenlib
98 #endif // #ifndef GINTENLIB_INCLUDED_TYPED_SAVER_HPP_