从具有有限生命的C ++函数返回非临时对象

时间:2013-11-18 19:02:18

标签: c++ logging

我正在为我的应用程序编写日志记录实用程序。出于某些原因选择这样做。我希望日志记录以

的形式发生
Logger logger;
...
logger.Info() << "This is log statement" << 1;

logger.Info()返回一个重载&lt;&lt;的另一个类型(LogStream)操作

class Logger
{
public:
  Logger(LogLevel level, LogWriter writer);
  ~Logger()
  {
    // Writes to Logwrite which sends logs to all appenders
  }

template <class T>
    LogStream& operator<<(const T& t)
    {
     m_output << t;
     return *this;
    }

private:
   std::ostringstream m_output;
   LogLevel m_loglevel;

}

class Logger
{
    LogStream Info()
    {
      return LogStream(INFO, m_writer); // NOT RIGHT
    }
}

有没有一种正确而优雅的方法可以通过Info()调用返回一个日志流实例,而无需额外的副本,并且生命周期有限,这样appender就可以记录(语句)而无需等到对象超出范围。

1 个答案:

答案 0 :(得分:0)

我怀疑你说你的代码示例有些不对劲。临时对象将在完整表达式结束时被销毁,除非绑定到引用 - 这在我看来恰好是将日志信息收集到原子消息然后刷新的正确粒度。

您唯一需要做的就是将复制构造函数自定义为而不是复制现有的缓冲数据,因为您不希望它复制到日志中。只需复制构造函数参数(编写器的句柄和严重性级别)。