C++ 如何得到一个C++;字符串流?

C++ 如何得到一个C++;字符串流?,c++,string,stream,C++,String,Stream,我在我的(simple)中添加函数,使其像流一样可用。 目前,经过一些修改后,我得到了这个(在我的cpp中): 我不知道该怎么做,甚至不知道这是否可能。我的第一个猜测是,可以在流的末尾使用std::endl,如下所示: log << getName() << " : application created." << std::endl; log您可以创建一个临时对象并使用其析构函数捕捉语句的结尾: 下面的代码应该会告诉您基本的想法 class Log {

我在我的(simple)中添加函数,使其像流一样可用。 目前,经过一些修改后,我得到了这个(在我的cpp中):

我不知道该怎么做,甚至不知道这是否可能。我的第一个猜测是,可以在流的末尾使用std::endl,如下所示:

log << getName() << " : application created." << std::endl; 

log您可以创建一个临时对象并使用其析构函数捕捉语句的结尾:

下面的代码应该会告诉您基本的想法

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);
}
类日志
{
公众:
类子日志
{
公众:
子日志(const std::string和message)
{

std::cout您可以创建一个临时对象,并使用其析构函数捕捉语句的结尾:

下面的代码应该会告诉您基本的想法

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);
}
类日志
{
公众:
类子日志
{
公众:
子日志(const std::string和message)
{

std::cout为什么要延迟到调用logText()才能真正记录消息?是的,addText()将填充std::stringstream,而logText()将做一些工作来“记录”流的字符串结果。logText()将字符串值写入文件和标准流中,并添加一些时间信息,因此“日志”只有在调用logText()时才必须考虑完成。如果文本为空,则调用将被忽略。为什么要延迟到调用logText()才能真正记录消息?是的,addText()将填充std::stringstream,而logText()将做一些工作来“记录”流的字符串结果。logText()在文件和标准流中写入字符串值,并添加一些时间信息,因此“日志”只需执行一次logText()调用。如果文本为空,则调用将被忽略。哇,使用临时对象及其析构函数,没有想到这一点。+1谢谢,它做得非常好,只有一个小临时对象!我将编辑帖子以给出当前的完整解决方案,因为一些细节必须修复。哇,使用临时对象及其析构函数,没有想到那.+1谢谢,它做得非常好,只有一个小的临时对象!我将编辑帖子,给出当前的完整解决方案,因为一些细节必须修复。
log.addText( getName() );
log.addText( " : application create." );
log.logText();
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";
}
    /** 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 );
LogStreamer operator<<( Log& log, const String& message )
{
    return LogStreamer( log, message );
}