[英]How to get the end of a C++ string stream?
我在我的(簡單) 日志類中添加了功能,以使其像流一樣可用。 目前,經過一些修改,我得到了這個(在我的cpp中):
// blah blah blah...
// note: here String is a defined as: typedef std::string String;
void Log::logMessage( const String& message )
{
logText(); // to be sure we flush the current text if any (when "composing" a message)
addText( message );
logText(); // really log the message and make the current text empty
}
// blah blah blah...
Log& operator<<( Log& log, const std::stringstream& message )
{
log.logMessage( message.str() );
return log;
}
Log& operator<<( Log& log, const String& message )
{
log.addText( message );
return log;
}
現在在我的“客戶端”應用程序中,我正在使用以下代碼檢查結果(如您已經猜到的那樣,m_log是有效的指針):
gcore::Log& log = *m_log;
log << getName() << " : application created.";
log << "This is a test for " << getName();
現在我遇到的問題是,從未調用過logText()(和logMessage),因為此測試代碼只會使用String調用<<操作符。 我需要的是一種在給定的字符串流完成時調用logText()的方法:
log << getName() << " : application created.";
相當於
log.addText( getName() );
log.addText( " : application create." );
log.logText();
我不確定如何執行此操作,即使可能也無法確定。 我的第一個猜測是,可以像這樣在流的末尾使用std :: endl:
log << getName() << " : application created." << std::endl;
或類似的方法,但是如果可以在不向流中添加對象的情況下做到這一點,那將是很好的。
任何想法?
您可以創建一個臨時對象,並使用其析構函數捕獲語句的結尾:
以下代碼應為您提供基本思路
class Log
{
public:
class Sublog
{
public:
Sublog(const std::string& message)
{
std::cout << message;
}
void addText(const std::string& message)
{
std::cout << message;
}
~Sublog()
{
std::cout << std::endl;
}
Sublog& operator<<(const std::string& message )
{
this->addText(message);
return *this;
}
};
};
Log::Sublog operator<<( Log& log, const std::string& message )
{
return Log::Sublog(message);
}
會像這樣使用
int main()
{
Log log;
log << "Foo" << "bar";
log << "baz" << "plop";
}
在每個分號之后,Sublog的析構函數稱為
克萊姆:就我而言,此解決方案的(有效且有效的)實現是:
在Log標頭中:
/** To allow streaming semantic on logs (used in << operator) .
*/
class LogStreamer
{
public:
LogStreamer( Log& log, const String& text )
: m_log( log )
{
m_log.addText( text );
}
~LogStreamer()
{
m_log.logText();
}
LogStreamer& operator<<( const String& text )
{
m_log.addText( text );
return *this;
}
private:
Log& m_log;
};
GCORE_API LogStreamer operator<<( Log& log, const String& message );
並在cpp文件中:
LogStreamer operator<<( Log& log, const String& message )
{
return LogStreamer( log, message );
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.