簡體   English   中英

如何獲得C ++字符串流的結尾?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM