對不起,標題不知道該怎麼稱呼我想要做的事。自動換行ostream
一些背景知識,如果您不喜歡閱讀,請跳到下一段。我有一個單元測試類,我調用斷言的一些條件,如果失敗,我輸出一些字符串傳入英寸我發現這是非常煩人的建立一個字符串發送到這個,如果我想說"Failed on index: " + i
。我的想法是返回std::ostream
而不是採取std::string
。如果斷言失敗,我將返回std::cerr
,如果斷言通過,則返回std::stringstream
。我想我可以做到這一切都很好。我不得不在我的單元測試類中存儲一個std::stringstream
,所以我可以返回一個引用。
我想要做的不是返回一個標準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
,它沒有複製構造函數)。
我正在尋找的是一些導致編譯器創建一個臨時newline_ostream是assert()
將盡快它不再使用(即不超過< <運營商)寫它導致成將死法。這是可能的,如果是這樣的話?
你說我不能做一個拷貝構造函數讓我思考,我想出了我的答案。您是否介意評論它是否有任何問題(如不能攜帶)? – CrazyCasta