【问题标题】:MISRA warning when overriding bitwise operator覆盖位运算符时的 MISRA 警告
【发布时间】: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


    【解决方案1】:

    MISRA 指南本质上说“对于任何二元运算符(称为@),如果您为您的班级重载operator@(),那么还要重载operator@=(),并确保它们的行为一致”。目的是确保(其中x 是您的类的一个实例)。

     x = x @ y;    //  @ may represent +, - , <<, *, /, .....
    

    与(即一致)具有相同的净效应。

    x @= y;
    

    在您的情况下,您的类具有(模板化的)operator&lt;&lt;() 重载,但没有相应的 operator&lt;&lt;=() 重载。

    停止警告的一种方法是在您提供operator&lt;&lt;() 时提供相应的operator&lt;&lt;=() 重载(反之亦然)。

    例如,提供operator&lt;&lt;=()

    template <typename T>
    LoggerWrapper& operator<<=(LoggerWrapper& record, T&& t)
    {
        if (record.log_enabled())
        {
            record.get_stream() << std::forward<T>(t);
        }
        return record;
    }
    

    并且(为了确保所需的一致性),使用定义operator&lt;&lt;()的方法,因此它调用operator&lt;&lt;=()

    template <typename T>
    LoggerWrapper& operator<<(LoggerWrapper& record, T&& t)
    {
         return operator<<=(record, t);
    } 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多