And*_*dry 6 c++ printing logging operator-overloading
我有一个用c ++编写的类,以便为我的应用程序编写日志文件.我已经构建了类并且它可以工作,它是这样的:
class Logger {
std::string _filename;
public:
void print(std::string tobeprinted);
}
Run Code Online (Sandbox Code Playgroud)
嗯,直观的是,为了在日志文件中打印一行,对于Logger的对象,只需要执行以下操作:
Logger mylogger("myfile.log");
mylogger.print(std::string("This is a log line"));
Run Code Online (Sandbox Code Playgroud)
好.使用方法方法与使用更好的模式(如<< is)不同.我想做以下事情:
Logger mylogger("myfile.log");
mylogger << "This is a log line";
Run Code Online (Sandbox Code Playgroud)
就这样.我想我必须重载<<运算符......但是使用这个签名重载(经典的):
ostream& operator<<(ostream& output, const MyObj& o);
Run Code Online (Sandbox Code Playgroud)
但我没有ostream ......那么,我应该这样做吗?
Logger& operator<<(Logger& output, const std::string& o);
Run Code Online (Sandbox Code Playgroud)
这是正确的方法吗?谢谢
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);
}
Run Code Online (Sandbox Code Playgroud)