3

テンプレート関数を使用して渡しており、さまざまなクラスのインスタンスを文字列ストリームに送信している可能性があります。これが引き続き機能することを確認するにはどうすればよいですか?

このための動作をどこで定義すればよいですか?文字列ストリームに送信される各クラスに必要なメンバーはありますか?既存の文字列ストリームを拡張または拡張する必要があります(sstreamから継承し、<<演算子をオーバーロードして可能なすべてを処理するクラスを構築することを考えていましたクラス)?

これに関するドキュメントを見つけることすら困難だったので、より多くのリソースへのリンクでさえ役立つでしょう。

4

2 に答える 2

6

ストリーム挿入演算子を作成したいように思えます。ストリームに出力できるようにしたいクラスの場合、free関数を定義します。

std::ostream& operator<<(std::ostream& stream, const SomeClassType& x)
{
    stream << x.someData();

    return stream;
}

したがって、がありSomeClassType z;、そうしている場合(または、またはstd::cout << zなどの他の出力ストリーム)、コンパイラは関数を探して見つけ、それを呼び出します。つまり、になり、その中に必要なものを出力します。fstreamstringstreamstd::cout << zoperator<<(std::cout, z)

于 2010-03-16T23:31:50.310 に答える
4

operator<<これらのクラスをオーバーロードする必要があります。

struct Point { int x, y; };

std::ostream& operator<<(std::ostream& os, const Point& p)
{
  return os << '(' << p.x << ", " << p.y << ')';
}

次に、関数で使用できます。これは次のようになります。

template <class T>
std::string to_string(const T& x)
{
  std::stringstream ss;
  ss << x;
  return ss.str();
}

int main()
{
  Point p = {1, 2};
  std::string ps = to_string(p);
  std::cout << ps << std::endl; // (1, 2)
}
于 2010-03-16T23:34:25.910 に答える