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 );
17 // t の値を退避してから t1 に書き換える
18 typed_saver( T& t, const T& t1 );
22 // これを呼ぶと、デストラクタで値が戻されることはなくなる
25 // 明示的な復帰(通常はデストラクタで復帰されるので書く必要なし)
31 コンストラクタで受け取った変数の値を記録し、デストラクタで書き戻します。
32 value_saver と違い変数の型を指定する必要がありますが、その分高速に動作します。
34 デストラクタ前でも restore() 関数を呼び出せば、強制的に書き戻すことが可能です。
35 その時はデストラクタでの値の書き戻しは行われませんので注意してください。
36 またデストラクタでの書き戻しを抑制したいときは、 release() 関数を呼び出せば OK です。
39 typed_saver, value_saver を利用できるオブジェクトの条件は、
40 「コピーコンストラクタか所有権移動コンストラクタを持っている」「 swap 可能」の二点です。
41 なので、ちゃんとした swap さえ実装すれば std::auto_ptr 等の変則クラスでも利用できます。
47 #include <boost/noncopyable.hpp>
48 #include <boost/utility/addressof.hpp>
52 // コンストラクタの時の値に、デストラクタで強制復帰させるオブジェクト
53 template< typename T >
58 // t の値を記録し、デストラクタで巻き戻す
59 explicit typed_saver( T& t )
60 : target_( boost::addressof(t) ), saver_(t) {}
62 // t の値を記録してから、t1 に変更、デストラクタで戻す
63 typed_saver( T& t, const T& t1 )
64 : target_( boost::addressof(t) ), saver_(t)
82 // 明示的な復帰(通常はデストラクタで復帰されるので書く必要なし)
88 swap( *target_, saver_ );
97 }; // class typed_saver<T>
99 } // namespace gintenlib
101 #endif // #ifndef GINTENLIB_INCLUDED_TYPED_SAVER_HPP_