我為日志記錄界面撰寫了一個簡單的包裝器,因此我可以使用左移運算子<< 來列印日志。
logger_wrapper.h
class LoggerWrapper
{
public:
LoggerWrapper(logging::LoggerInterface *logger, logging::LogPriority priority);
~LoggerWrapper();
bool log_enabled();
std::stringstream& get_stream();
private:
std::stringstream stream_;
logging::LoggerInterface *logger_;
logging::LogPriority priority_;
};
template <typename T>
LoggerWrapper& operator<<(LoggerWrapper& record, T&& t) {
if (record.log_enabled())
{
record.get_stream() << std::forward<T>(t);
}
return record;
}
template <typename T>
LoggerWrapper& operator<<(LoggerWrapper&& record, T&& t)
{
return record << std::forward<T>(t);
}
logger_wrapper.cpp
#include "logger_wrapper.h"
LoggerWrapper::LoggerWrapper(logging::LoggerInterface *logger, logging::LogPriority priority)
: logger_{ logger }
, priority_ { priority }
{
}
bool LoggerWrapper::log_enabled()
{
return (nullptr != logger_) && (logger_->isLogPriorityEnable(priority_));
}
std::stringstream& LoggerWrapper::get_stream()
{
return stream_;
}
LoggerWrapper::~LoggerWrapper()
{
if (log_enabled())
{
logger_->log(priority_, stream_.str());
}
}
代碼編譯成功,但我有一些 MISRA 警告:
M5.17.1 (required): Missing overload for corresponding assignment version of operator (operator<<<basic_string&>())
M5.17.1 (required): Missing overload for corresponding assignment version of operator (operator<<<basic_string<char,char_traits<char>,allocator<char>>>())
M5.17.1 (required): Missing overload for corresponding assignment version of operator (operator<<<const atomic&>())
M5.17.1 (required): Missing overload for corresponding assignment version of operator (operator<<<const basic_string&>())
M5.17.1 (required): Missing overload for corresponding assignment version of operator (operator<<<const char (&)[10]>())
...
根據 MISRA C 2008,規則 M-5-17-1 規定:
The semantic equivalence between a binary operator and its assignment operator form shall be preserved.
我希望有人可以向我解釋這些警告的含義以及我應該怎么做才能將其洗掉。非常感謝任何答復。謝謝你。
uj5u.com熱心網友回復:
MISRA 指南本質上說“對于任何二元運算子(稱為@),如果您operator@()為您的類多載operator@=(),那么也會多載,并確保它們的行為一致”。目的是確保(x你的類的實體在哪里)。
x = x @ y; // @ may represent , - , <<, *, /, .....
與(即與)具有相同的凈效應。
x @= y;
在您的情況下,您的類具有(模板化)多載,operator<<()但沒有相應的operator<<=().
停止警告以提供相應過載的一種方法,operator<<=()無論何時提供operator<<() (或反之亦然)。
例如,提供一個 operator<<=()
template <typename T>
LoggerWrapper& operator<<=(LoggerWrapper& record, T&& t)
{
if (record.log_enabled())
{
record.get_stream() << std::forward<T>(t);
}
return record;
}
并且(以確保所需的一致性),使用定義 的方法,operator<<()因此它呼叫operator<<=().
template <typename T>
LoggerWrapper& operator<<(LoggerWrapper& record, T&& t)
{
return operator<<=(record, t);
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/394770.html
下一篇:用另一個字串替換任何行
