8

lexical_castからのコード スニペット:

class lexical_castable {
public:
  lexical_castable() {};
  lexical_castable(const std::string s) : s_(s) {};

  friend std::ostream operator<<
    (std::ostream& o, const lexical_castable& le);
  friend std::istream operator>>
    (std::istream& i, lexical_castable& le);

private:
  virtual void print_(std::ostream& o) const {
    o << s_ <<"\n";
  }

  virtual void read_(std::istream& i) const {
    i >> s_;
  }

  std::string s_;
};

std::ostream operator<<(std::ostream& o,
  const lexical_castable& le) {
  le.print_(o);
  return o;
}

std::istream operator>>(std::istream& i, lexical_castable& le) {
  le.read_(i);
  return i;
}

ドキュメントに基づいて、

template<typename Target, typename Source>
  Target lexical_cast(const Source& arg);

1> arg を標準ライブラリの文字列ベースのストリームにストリーミングした結果を返し、次に Target オブジェクトとして出力します。

2> ソースは OutputStreamable です

3> ターゲットは InputStreamable です

質問 1 > ユーザー定義型 (UDT) の場合、OutputStreamable または InputStreamable は常に処理する必要がありstd::stringますか? たとえば、メンバー変数として単純な整数を含むクラスが与えられた場合、 and を定義するoperator<<operator>>、実装コードはどのようになりますか? 整数を文字列として変換する必要がありますか? 私の理解に基づくと、UDTは実際の変換ジョブを処理std::stringするために常に処理する必要があり、中間体を必要boost::lexical_castとするようです。boost::lexcial_caststd::string

質問2 >上記のコードのoperator<<orの戻り値がそれぞれorを参照していないのはなぜですか?operator>>std::ostream&std::istream&

4

1 に答える 1

8

クラスをlexical_castで使用できるようにするには、クラスの「ストリーム」演算子を定義するだけです。Boost.LexicalCastの概要から:

  • SourceはOutputStreamableです。これは、左側に またはオブジェクトを取り、右側に引数タイプのインスタンスoperator<<をとるが定義されていることを意味します。std::ostreamstd::wostream
  • ターゲットはInputStreamableです。つまり、左側に またはオブジェクトを取り、右側に結果タイプのインスタンスoperator>>をとるが定義されています。std::istreamstd::wistream
  • ターゲットはCopyConstructible[20.1.3]です。
  • ターゲットはDefaultConstructibleです。つまり、そのタイプのオブジェクトをデフォルトで初期化することができます[8.5、20.1.4]。

// either inline friend, out-of-class friend, or just normal free function
// depending on whether it needs to access internel members
// or can cope with the public interface
// (use only one version)
class MyClass{
  int _i;
public:
  // inline version
  friend std::ostream& operator<<(std::ostream& os, MyClass const& ms){
    return os << ms._i;
  }

  // or out-of-class friend (friend declaration inside class only)
  friend std::ostream& operator<<(std::ostream& os, MyClass const& ms);

  // for the free function version
  int get_i() const{ return _i; }
};

// out-of-class continued
std::ostream& operator<<(std::ostream& os, MyClass const& ms){
  return os << ms._i;
}

// free function, non-friend
std::ostream& operator<<(std::ostream& os, MyClass const& ms){
  return os << ms.get_i();
}

もちろん同じですoperator>>

于 2011-12-25T16:41:03.090 に答える