## 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 月