我有一個第三方(日誌記錄)類,它重載了運算符<。使用此記錄器類的客戶端代碼可以通過調用其中一個預定義的宏來使用它。作爲一個例子: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