【发布时间】:2021-12-27 13:20:58
【问题描述】:
我为日志接口写了一个简单的包装器,所以我可以使用左移运算符
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.
我希望有人可以向我解释这些警告的含义以及我应该如何删除它。 非常感谢任何回复。谢谢。
【问题讨论】:
标签: c++ templates operator-overloading misra