#include <iostream>
#include <boost/io/ios_state.hpp>
using namespace std;
void print_hex( int n )
{
boost::io::ios_flags_saver ifs( cout );
cout << hex << n << endl;
} // ここで ifs のデストラクタが呼ばれる。
int main()
{
print_hex( 90 );
cout << 90 << endl;
return 0;
}
5a 90
上記の例から単純に ios_flags_save
を除いてしまうと、
2回目の出力でも16進表示になってしまいます。
printf
では16進数で表示しようと思ったら "%x"
などと書いて指定していましたが、iostream
では、hex
というマニピュレータなるものを送り込むことで設定を変更して対応します。
…と、そこまでは良いのですが、この方式の問題は、
一度モードを16進に変更してしまうとずっとそのままその状態を記憶し続けること。
一変数だけ別の表示にしたい、というような時には、
変更前のストリームの状態を一旦保存して置いて、表示の後に戻す、
という作業が必要になります。ios_state
では、その
「一旦保存して戻す」という作業を、
コンストラクタ・デストラクタのタイミングで実行してくれます。
保存したい属性(フラグ、精度、表示幅、埋め文字などなど)に応じて、
色々な種類の saver が用意されています。とにかく全部を復元したいときは、
ios_all_saver
なんてのも。