我有一个第三方(日志记录)类,它重载了运算符<。使用此记录器类的客户端代码可以通过调用其中一个预定义的宏来使用它。作为一个例子:C++运算符<< overload
//logs can be filtered based on this module id string
LOGGER_INFO("MODULE_ID_STR") << "Logging at info level";
我想延长这个特征,其中使用该第三方记录器的类/模块不具有每次包含模块的ID字符串。含义 - 客户端代码应该再设置模块ID字符串,然后能够做到这一点:
cLogger.INFO << "Logging at info level";
以上调用应该在内部使用已注册的模块ID字符串更早注册,然后用它来进行实际的第三方日志调用。因此,这可以通过在每个日志级别上重载运算符来优化C++。
一些额外的细节......我开始做这个:
这是一个扩展的第三方记录仪的功能类:
class LoggerEx
{
public:
LoggerEx(const std::string &moduleToLog)
{
m_ModuleID = moduleToLog;
};
virtual ~LoggerEx() {};
class Debug
{
//overload the << operator (how to write this..??)
LOGGER_INFO(m_ModuleID) << "Logging at info level";
};
class Info
{
//overload the << operator
};
//Note that there could be more such levels
// (INFO, WARN, ERROR, TRACE, FATAL, etc).
public:
Debug DEBUG;
Info INFO;
protected:
std::string m_ModuleID
};
使用记录器类的一些客户机代码被允许做这个...
class Xyz
{
public:
Xyz() : l("Xyz")
{}
void doSomething()
{
l.DEBUG << "Doing something";
}
protected:
Logger l;
};
另一个客户端类...
class Mno
{
public:
Xyz() : l("Mno")
{}
void processSomething()
{
l.INFO << "Process something";
}
protected:
Logger l;
};
由于原始记录器支持多种数据类型(int,float,chars,std :: string),上面的方法是否可行,还是有其他的想法/解决方案可以在C++中更优雅地编写完整的封装(或复制代码)到记录器?
谢谢...
你问的是如何重载一个操作符或其他东西? – jaredad7
是和否是的 - 如果过载是解决方案。没有,如果有其他可能的解决方案(如模板等) 但是,如何编写重载方法<<,并仍使用模块ID字符串调用底层(日志)宏?请注意,我不想为所有不同的可能数据类型编写重载方法。 – user3605077
最优雅和整合的方法将使用标准输出流,并具有用于设置警告级别,日志级别和模块名称的附加构面。 当然,这种方法也需要自定义流缓冲。 – Deduplicator