Моя команда разрабатывает встроенную систему, где нам нужно следовать MISRA C++.
Мы реорганизуем код, чтобы использовать меньше виртуальных методов, поэтому мы пытаемся реализовать CRTP для использования статического полиморфизма вместо динамического.
Но у нас есть проблема, что статический полиморфизм требует преобразования указателя, поэтому наш статический анализатор проверки жалуется.
Вот интерфейс
template <typename T>
class UpdateMethod
{
protected:
~UpdateMethod() {}
public:
void operator()() const
{
// [MISRA Rule 5-2-7] violation:
static_cast<const T*>(this)->update();
}
};
Вот одна из реализаций:
class A
: public UpdateMethod<A>
{
public:
void update() const {}
};
Когда проходит контролер MISRA, он жалуется на static_cast (преобразование из ptr в ptr (e926).
Итак, мой вопрос: есть ли хороший способ реализовать CRTP без необходимости пресекать предупреждение MISRA, поэтому безопасным способом?
Связанный с этим вопрос только о преобразовании указателя: MISRA C++ 2008 Правило 5-2-7 Нарушение: объект с типом указателя не должен быть преобразован в несвязанный тип указателя, прямо или косвенно у меня такая же ошибка в CRTP.
Изменение: как упоминалось только C++ 03, и никакой внешней библиотеки, такой как boost.