我正在为我的(简单)log class添加函数,使其像流一样可用。 目前,经过一些修改,我得到了这个(在我的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),因为这个测试代码只会调用&lt;&lt;运算符与字符串。 我需要的是一种在给定的字符串蒸汽结束时调用logText()的方法:
log << getName() << " : application created.";
等同于
log.addText( getName() );
log.addText( " : application create." );
log.logText();
我不确定如何做到这一点,即使有可能。我的第一个猜测是,可以在流的末尾使用std :: endl,如下所示:
log << getName() << " : application created." << std::endl;
或类似的东西,但如果可以在不向流添加对象的情况下这样做,那就太好了。
有什么想法吗?
答案 0 :(得分:3)
您可以创建一个临时对象并使用他的析构函数来捕获语句的结尾:
以下代码应该为您提供基本的想法
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的析构函数被称为
Klaim:在我的案例中,这个解决方案的(工作和有效)实现:
日志标题中的:
/** 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 );
}