私がやろうとしていることを何と呼ぶべきかわからない、悪いタイトルで前もって申し訳ありません。
いくつかの背景、読みたくない場合は、次の段落にスキップしてください。いくつかの条件で assert を呼び出す単体テスト クラスがあり、それが失敗した場合は、渡された文字列を出力します"Failed on index: " + i
。std::ostream
私の考えは、 aを取る代わりにa を返すことstd::string
です。アサートが失敗した場合は を返しstd::cerr
、アサートが成功した場合は を返しstd::stringstream
ます。私はこれをすべてうまくやることができると思います。std::stringstream
参照を返すことができるように、単体テスト クラスにa を格納する必要があります。
私がやりたいのは、標準リターンを返す代わりに、完了時に出力std::ostream
する拡張を返すことです。そのため、アサートごとにそれを覚えておく必要はありません。具体的には次のような考え方です。std::ostream
std::endl
UnitTest("My test");
ut.assert(false) << "Hello world";
ut.assert(1 == 0) << "On the next line";
破棄時にこの新しいクラスはエンドラインを出力し、使用されなくなるとすぐに破棄されるという考えです (つまり、 << 演算子がなくなります)。これまでのところ、これが私が持っているものです(アサートのコードの一部を削除しました。実際にはクラス内にありますが、何が起こっているのかを示すにはこれで十分です):
class newline_ostream : public std::ostream
{
public:
newline_ostream(std::ostream& other) : std::ostream(other.rdbuf()){}
~newline_ostream() { (*this) << std::endl; }
};
newline_ostream& assert(bool condition, std::string error)
{
if(!condition)
{
return newline_ostream(std::cerr);
}
return newline_ostream(std::stringstream());
}
このメソッドを試してみると、基本的に、作成したばかりのオブジェクトを返すのは間違っているというメッセージが表示されます。これは左辺値ではないためです。参照を返さないように変更しようとすると、コピー コンストラクターがないと不平を言います (おそらく、これは拡張std::ostream
中であり、コピー コンストラクターがないためです)。
私が探しているのは、コンパイラがassert()
結果を書き込む一時的な newline_ostream を作成するメソッドであり、使用されなくなるとすぐに終了します (つまり、 << 演算子はなくなります)。これは可能ですか?