このアプローチの利点は次のとおりです。
-普遍性:ストリームの接続先は関係ありません-コンソール、ファイル、ソケットからの入力/出力、プロセスは同じです。
-透明性:プログラマは、入力または出力オブジェクトのタイプを明示的に示す必要はありません。
-拡張性:プログラマは、対応する演算子をオーバーロードするだけで、オブジェクトのストリームにI / Oサポートを追加できます。
IOStreamライブラリには、入力/出力ストリームをメモリ内の文字列に関連付けることができる
stringstream
クラスもあります。 そのようなストリームに出力されるものはすべて、行の最後に追加されます。 ストリームから読み取られるものはすべて、行の先頭から取得されます。
たとえば、型変換を実行するなど、非常に面白いことを行うことができます。
#include <sstream> #include <iostream> int main(int argc, char* argv[]) { std::stringstream ss; ss << "22"; int k = 0; ss >> k; std::cout << k << std::endl; return 0; }
さらに、このクラスを使用して、たとえば次のような複雑な文字列をフォーマットできます。
void func(int id, const std::string& data1, const std::string& data2) { std::stringstream ss; ss << "Operation with id = " << id << " failed, because data1 (" << data1 << ") is incompatible with data2 (" << data2 << ")"; std::cerr << ss.str(); }
この場合、メッセージを直接
cerr
出力できるため、
stringstream
の使用
stringstream
不要であることは明らかです。 しかし、メッセージを標準ストリームではなく、たとえば
syslog()
関数を使用してシステムログに出力する場合はどうでしょうか。 または、この行を説明として含む例外をスローします。
void func(int id, const std::string& data1, const std::string& data2) { std::stringstream ss; ss << "Operation with id = " << id << " failed, because data1 (" << data1 << ") is incompatible with data2 (" << data2 << ")"; throw std::runtime_error(ss.str()); }
最初に文字列を形成し、次に
str()
メソッドを使用して取得する中間
stringstream
オブジェクトが必要であることが
stringstream
ます。 同意しますか?
C ++は 、その過度の複雑さと冗長性のせいにされることがありますが、場合によっては、非常にエレガントなデザインを作成できます。 そして今、 テンプレートと演算子をオーバーロードする機能により、
stringstream
ラッパーを作成することができました。
void func(int id, const std::string& data1, const std::string& data2) { throw std::runtime_error(MakeString() << "Operation with id = " << id << " failed, because data1 (" << data1 << ") is incompatible with data2 (" << data2 << ")"); }
そして、ここに
MakeString
自体があります。
class MakeString { public: template<class T> MakeString& operator<< (const T& arg) { m_stream << arg; return *this; } operator std::string() const { return m_stream.str(); } protected: std::stringstream m_stream; };
とても簡単に機能します。 一方、
MakeString
クラスでは、
MakeString
演算子(<<)がオーバーロードされます。これは、任意の型のオブジェクトへの定数参照を引数として受け取り、このオブジェクトを内部の
MakeString
に直ちに出力し、それ自体へのリンクを返します。 一方、文字列への変換演算子はオーバーロードされ、
stringstream
によって形成された文字列を返します。
おそらく、このラッパーは誰かに役立つことがわかるでしょう。 私はコメント、提案、提案を聞いてうれしいです。