gpt4 book ai didi

c++ - 以类似 cout 的符号在 C++ 中管理日志流

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:17:29 27 4
gpt4 key购买 nike

我有一个 C++ 类,用于为我的应用程序编写日志文件。我已经构建了这个类并且它可以工作,它是这样的:

class Logger {
std::string _filename;
public:
void print(std::string tobeprinted);
}

嗯,很直观,为了在日志文件中打印一行,对于 Logger 对象,只需要执行以下操作:

Logger mylogger("myfile.log");
mylogger.print(std::string("This is a log line"));

嗯。使用方法方法与使用像 << 这样更好的模式是不同的。我想执行以下操作:

Logger mylogger("myfile.log");
mylogger << "This is a log line";

就是这样。我想我必须重载 << 运算符......但是使用这个签名(经典签名)重载:

ostream& operator<<(ostream& output, const MyObj& o);

但是我没有ostream...那么,我应该怎么做呢?

Logger& operator<<(Logger& output, const std::string& o);

这是正确的方法吗?谢谢

最佳答案

class Log
{
public:

enum Level { Debug, Error, Info };

static ostream& GetStream() { return cout; }
static bool IsLevelActive(Level l) { return true; }
};

#ifndef NO_LOG
#define LOG_ERROR(M) do { if (Log::IsLevelActive(Log::Error)) (Log::GetStream() << "ERR: " << M << "\n"); } while (false)
#define LOG_INFO(M) do { if (Log::IsLevelActive(Log::Info)) (Log::GetStream() << "INF: " << M << "\n"); } while (false)
#define LOG_WARNING(M) do { if (Log::IsLevelActive(Log::Warning)) (Log::GetStream() << "WRN: " << M << "\n"); } while (false)
#else
#define LOG_ERROR(M)
#define LOG_INFO(M)
#define LOG_WARNING(M)
#endif

struct MyObject {
int a, b;
};

ostream& operator<<(ostream& ostr, const MyObject& obj) {
ostr << "(a=" << obj.a << ", b=" << obj.b << ")";
return ostr;
}

void test() {
int v1 = 42;
int v2 = 43;
LOG_INFO("value1=" << v1 << ", value2=" << v2);

MyObject o = {1, 2};
LOG_INFO("obj=" << o);
}

关于c++ - 以类似 cout 的符号在 C++ 中管理日志流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4563094/

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