以下に、抽出子のパターンを示します。
template<class charT, class Traits>
basic_istream<charT, Traits>& operator >>
(basic_istream<charT, Traits >& is, UserDefinedType& x)
{
ios_base::iostate err = 0;
try {
typename basic_istream<charT, Traits>::sentry ipfx(is);
if(ipfx)
{
// 必要な操作を行ってください。
// 一般にはストリームのロケールやバッファにアクセスします。
// MT 環境ではストリームメンバー関数を呼び出さないでください。
// 必要に応じて err 変数に状態ビットを追加してください。たとえば
// () err |= ios_base::failbit; ならば
}
} // 実行
catch(...) //1
{
bool flag = FALSE;
try { is.setstate(ios_base::failbit); } //2
catch( ios_base::failure ) { flag= TRUE; } //3
if ( flag ) throw; //4
}
if ( err ) is.setstate(err); //5
return is;
}
同様に、挿入子のパターンを次に示します。
template<class charT, class Traits>
basic_ostream<charT, Traits>& operator <<
(basic_ostream<charT, Traits >& os, const UserDefinedType& x)
{
ios_base::iostate err = 0;
try {
typename basic_ostream<charT, Traits>::sentry opfx(os);
if(opfx)
{
// 必要な操作を行ってください。
// 一般にはストリームのロケールやバッファにアクセスします。
// MT 環境ではストリームメンバー関数を呼び出さないでください。
// 必要に応じて err 変数に状態ビットを追加してください。たとえば
// () err |= ios_base::failbit; ならば
// 使用後はフィールド幅をリセットしてください。すなわち、
// os.width(0);
}
} //実行
catch(...)
{
bool flag = FALSE;
try { os.setstate(ios_base::failbit); }
catch( ios_base::failure ) { flag= TRUE; }
if ( flag ) throw;
}
if ( err ) os.setstate(err);
return os;
}
Copyright (c) 1998, Rogue Wave Software, Inc.
このマニュアルに関する誤りのご指摘やご質問は、電子メールにてお送りください。
OEM リリース, 1998 年 6 月