2

これを行うと、stringstream はどのように機能しますか。

stringstream ss;
ss << "123" << "abc";

使い捨ての「123abc」文字列を作成しますか、それとも文字列ストリームに対して両方の操作を連続して実行しますか?

その機能を複製したいのですが、上記のコードのような2つのパラメーターで機能するオーバーロードはないようです...

4

3 に答える 3

12

これは、 << 演算子の 2 つの別個の関数呼び出しを行うのと同じです。

(ss.operator<<("123")).operator<<("abc")

はい、両方の操作を「連続して」実行します。

于 2013-01-17T18:21:46.323 に答える
5

実際にはこれと同等です:

std::operator<<(std::operator<<(ss, "123"), "abc");

引数として取るメンバー関数がないことに注意してください。const char*これは非メンバー関数であり、ss最初の引数としてconst char*渡され、2 番目の引数として渡されます。関数は戻りstd::ostream&、それを再度渡します。それはもっとこのようなものです:

print( print (ss, "123"), "abc"); //just for clarity

これは、2 つの関数呼び出しがあることを意味します。に置き換えprintますstd::operator<<。すべてが今明らかになります。

それが役立つことを願っています。


これを言う他の答え:

(ss.operator<<("123")).operator<<("abc") //copied from other answer (wrong)

間違っている!operator<<引数const char*として受け取るものは真ではないメンバー関数であると想定しているため、間違っています!

于 2013-01-17T18:30:36.933 に答える
1

std::stringstream::operator<<(const char*)を返しますstd::stringstream&

この手法により、それを「連鎖」させることができます。

これは完全に真実ではありませんが、あなたの目的にとっては真実とほとんど同じです。

もう少し正確なステートメントは、std::stringstream& operator<<(std::stringstream&, const char*)連鎖させることができるということです。

さらに正確なステートメントは、ostream& operator<<(ostream&, const char*)存在し、でありstd::stringstream、それを呼び出すとostreamオーバーロード解決です。<<

于 2013-01-17T18:26:26.983 に答える