これを行うと、stringstream はどのように機能しますか。
stringstream ss;
ss << "123" << "abc";
使い捨ての「123abc」文字列を作成しますか、それとも文字列ストリームに対して両方の操作を連続して実行しますか?
その機能を複製したいのですが、上記のコードのような2つのパラメーターで機能するオーバーロードはないようです...
これを行うと、stringstream はどのように機能しますか。
stringstream ss;
ss << "123" << "abc";
使い捨ての「123abc」文字列を作成しますか、それとも文字列ストリームに対して両方の操作を連続して実行しますか?
その機能を複製したいのですが、上記のコードのような2つのパラメーターで機能するオーバーロードはないようです...
これは、 << 演算子の 2 つの別個の関数呼び出しを行うのと同じです。
(ss.operator<<("123")).operator<<("abc")
はい、両方の操作を「連続して」実行します。
実際にはこれと同等です:
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*
として受け取るものは真ではないメンバー関数であると想定しているため、間違っています!
std::stringstream::operator<<(const char*)
を返しますstd::stringstream&
。
この手法により、それを「連鎖」させることができます。
これは完全に真実ではありませんが、あなたの目的にとっては真実とほとんど同じです。
もう少し正確なステートメントは、std::stringstream& operator<<(std::stringstream&, const char*)
連鎖させることができるということです。
さらに正確なステートメントは、ostream& operator<<(ostream&, const char*)
存在し、でありstd::stringstream
、それを呼び出すとostream
オーバーロード解決です。<<