error_stream
から派生したカスタム ストリーム タイプを作成し、それを と呼びますstd::ostringstream
。throw_cpp_class
(throw_cpp
は のインスタンスです)というストリーム用のカスタム マニピュレータも作成しましたthrow_cpp_class
。私の目標は、この構文を持つことでした:
error_stream s;
s << "some error " << message() << throw_cpp; // throw_cpp throws an exception containing contents of the stream.
ストリームへの右辺値参照を最初のオペランドとして受け取る挿入演算子を定義することで、これを実行できることがわかりました。
error_stream() << "some error " << message() << throw_cpp;
挿入演算子は次のようになります。
error_stream& operator<<(error_stream&& s, const throw_cpp_class&)
{
throw s.str();
return s;
}
何が起きてる?error_stream&&
がerror_stream&
必要なタイプの値を返すことができるのはなぜですか? (これは移動コンストラクターを呼び出しますか?)。これはひどく非効率的ですか?(例外はまれであるため、私は本当に気にしません)。