您的解決方案有幾個問題。首先是你 按值通過stringstream
,它不支持複製。您需要 作爲參考。第二個是在調用點的 的operator<<
重載返回值ostream&
,不stringstream
,由於 stringstream
不是一個基類的ostream&
(這是其他方式 輪),你不能初始化stringstream
(或stringstream&
) 與它。最後,沒有operator<<
需要 stringstream
作爲右手參數,因此 LogStream
函數中的語句無法工作。最後,無論如何,這對用戶來說會有些尷尬。 operator<<
的日誌是非成員, 與ostream&
非const引用作爲第一個參數,所以您不能用 作爲臨時參數調用它們作爲左參數。 (在你的榜樣通話,當然 ,你忘了反正創建std::ostringstream
;它 不會編譯,因爲不存在<<
超載,這需要char const[]
或char const*
作爲其左操作數。)
有幾乎是解決所有這些問題的解決方法。東西 喜歡:
void LogStream(std::ostream& text)
{
std::ostringstream& s = dynamic_cast<std::ostringstream&>(text);
m_FileHandle << s.str() << std::endl;
}
處理所有的除了最後的問題;最後必須由客戶端來處理 ,是這樣的:
m_LogObject->LogStream(std::ostringstream().flush() << "..." << x);
(以std::ostream::flush()
調用返回非const引用 流,可用於初始化進一步std::ostream&
而當你。不能初始化一個臨時的非const引用, 你可以調用它的非const成員函數)。
的這個客戶端代碼中的尷尬讓我一般喜歡 更復雜的解決方案。我定義了一個特殊的LogStreamer
類, 是這樣的:
class LogStreamer
{
boost::shared_ptr<std::ostream> m_collector;
std::ostream* m_dest;
public:
LogStreamer(std::ostream& dest)
, m_collector(new std::ostringstream)
, m_dest(&dest)
{
}
~LogStreamer()
{
if (m_collector.unique()) {
*m_dest << m_collector->str() << std::endl;
}
}
template <typename T>
LogStreamer& operator<<(T const& value)
{
*m_collector << value;
return *this;
}
};
和
LogStreamer LogStream() { return LogStreamer(m_FileHandle); }
,客戶端代碼可以寫:
m_LogObject->LogStream() << "..." << x;
在我自己的代碼:日誌對象始終是一個單身人士,電話是 通過一個宏,它通過__FILE__
和__LINE__
到LogStream()
函數,並且最終目標ostream是一個特殊的streambuf,具有 特殊功能,由LogStream()
調用,它接受一個文件名和一個 行號,將它們連同時間戳一起輸出到 的下一行輸出,並縮進所有其他行。一種過濾 流緩衝的東西,如:
class LogFilter : public std::streambuf
{
std::streambuf* m_finalDest;
std::string m_currentHeader;
bool m_isAtStartOfLine;
protected:
virtual int overflow(int ch)
{
if (m_isAtStartOfLine) {
m_finalDest->sputn(m_currentHeader.data(), m_currentHeader.size());
m_currentHeader = " ";
}
m_isAtStartOfLine = (ch == '\n');
return m_finalDest->sputc(ch);
}
virtual int sync()
{
return m_finalDest->sync();
}
public:
LogFilter(std::streambuf* dest)
: m_finalDest(dest)
, m_currentHeader("")
, m_isAtStartOfLine(true)
{
}
void startEntry(char const* filename, int lineNumber)
{
std::ostringstream header;
header << now() << ": " << filename << " (" << lineNumber << "): ";
m_currentHeader = header.str();
}
};
(功能now()
,當然,返回std::string
與 時間戳或一個struct tm
,你已經寫了一個<<
爲tm
。)
什麼不起作用?錯誤,錯誤的行爲? – 2011-06-08 14:21:35