gpt4 book ai didi

c++ - 如何获取 C++ 字符串流的结尾?

转载 作者:行者123 更新时间:2023-11-28 01:12:53 25 4
gpt4 key购买 nike

我正在向我的(简单)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),因为此测试代码只会调用带有字符串的 << 运算符。我需要的是一种在给定的字符串流完成时调用 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的析构函数


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 );
}

关于c++ - 如何获取 C++ 字符串流的结尾?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1296316/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com