Rogue Wave バナー
前へマニュアルの先頭へ目次次へ

11.6 ユーザー定義型の抽出子と挿入子のパターン

以下に、抽出子のパターンを示します。

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 月