未知のクラスをC ++のストリームストリートに渡します
質問
私はテンプレート関数を使用しており、合格しており、さまざまなクラスのインスタンスを文字列ストリームに送信する可能性があります。これが機能し続けることを確認するために私は何ができますか?
もっと具体的にさせてください。これの動作はどこに定義できますか?各クラスに文字列ストリームに送信されるメンバーはありますか?既存の文字列ストリームを強化または拡張する必要があります(SSTREAMから継承し、<<オペレーターを過負荷にするクラスを構築すると考えていました。クラス)?
これに関するドキュメントを見つけるのに苦労したので、より多くのリソースへのリンクでさえ役立ちます。
解決
ストリーム挿入演算子を作りたいように聞こえます。クラスの場合、ストリームに出力できるようにしたい場合は、自由関数を定義します。
std::ostream& operator<<(std::ostream& stream, const SomeClassType& x)
{
stream << x.someData();
return stream;
}
だから私たちが持っているなら SomeClassType z;
, 、そして私たちはします std::cout << z
(またはその他の出力ストリーム、 fstream
また stringstream
)、コンパイラは私たちの関数を探して見つけ、それを呼び出します。あれは、 std::cout << z
なります operator<<(std::cout, z)
そしてその中には、必要なものが出力されます。
他のヒント
オーバーロードするだけです 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)
}
所属していません StackOverflow