gpt4 book ai didi

c++ - 除了用宏,不能用 C++ 表达自己

转载 作者:行者123 更新时间:2023-11-28 00:24:07 25 4
gpt4 key购买 nike

我有一个宏可以完全按照我的意愿执行:

    #define LOG(x)\
do { if (!cpp::app::g_app) {\
ASSERT("CANNOT LOG IF THERE IS NO CPP APP OBJECT" == 0);\
}\
else \
{ \
std::stringstream s; s << cpp::timing::currentDateTime(); s << '\t'; s << x << std::endl; \
*cpp::app::g_app << s.str(); \
cpp::app::g_app->flush(true);\
} \
} while(0)

#endif

这真的很好,因为我可以:

LOG("On first log line " << 0 << "Still on first log line")

..一旦 LOG 宏完成,就会插入一个换行符。

输出如下:

<date / time> On First log line 0 Still on first log line
... subsequent lines here

我的问题是如何重载 <<运算符(operator)在我的日志类上做同样的事情?

如果我简单地重载 <<运算符并返回 *this(我的日志记录案例可以转换为 ostream)然后如果我这样做:

mylogger << "First line " << "Still on first line";

然后输出是这样的:

<date and time> First line
<date and time> Still on first line.

所以,我想用 << 模拟宏行为运算符(operator)。当 << 的整个链条时,我想要自动换行操作完成,就像在宏中一样。但是,由于宏是邪恶的,我宁愿将其转换为适当的函数。

这可以实现吗?

编辑:Matt 关于助手类的想法非常好。根据他的建议,我做了如下一次性助手类:

    class log
{
public:
log() :
m_stream(cpp::app::g_app->stream()){

}

template <typename T>
log& operator << (const T& t)
{
m_ss << t;
return *this;
}

virtual ~log(){
m_stream << cpp::timing::currentDateTime() << "\t" << m_ss.str() << "\r\n";
m_stream.flush();
}

private:
std::ostream& m_stream;
std::stringstream m_ss;
};

像这样使用它:

log() << "All this text" << " will be on one line in the logfile, with date and time prepended ";
log() << "And this lot falls on line 2, with date and time prepended";

我希望这对 Galik 和其他可能想要同样东西的人有所帮助。

最佳答案

对问题中提供的解决方案的一个小改进,即创建更少的临时对象:

class log
{
public:
log() :
m_stream(cpp::app::g_app->stream()){
}

template <typename T>
std::ostream& operator<< (const T& t)
{
return m_stream << cpp::timing::currentDateTime() << "\t" << t;
}

virtual ~log(){
m_stream << "\r\n";
m_stream.flush();
}

private:
std::ostream& m_stream;
};

log() 的临时实例即使它不是从 operator<< 返回的,也会在完整表达式的末尾被销毁.不妨摆脱中间人和额外的字符串流缓冲区(顺便说一句,不尊重主流上现有的格式选项——这可能是好是坏)

关于c++ - 除了用宏,不能用 C++ 表达自己,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25924243/

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