AUTOSAR C++14 Rule A14-5-2

Члены класса, которые не зависят от параметров класса шаблона, должны быть определены в отдельном базовом классе

Описание

Определение правила

Члены класса, которые не зависят от параметров класса шаблона, должны быть определены в отдельном базовом классе.

Объяснение

Для доступа к представителю класса шаблона необходимо создать экземпляр шаблона. Если представитель не зависит от параметра шаблона, этот шаг создания экземпляра не требуется. Например, представители anotherMember и someotherMember этого класса шаблона aClass не зависят от параметра T:

template <typename T>
class aClass {
   T aMember
   int anotherMember;
   int someotherMember
}
Однако для доступа к этим представителям необходимо создать экземпляр класса шаблона aClass. Чтобы избежать ненужных экземпляров шаблона, не включать этих представителей в объявление шаблона.

Включение этого представителя в объявление шаблона также вызывает ненужное пятно кода. Компиляторы генерируют отдельную копию класса шаблона для каждого экземпляра шаблона. Если член класса не зависит от параметра шаблона, для каждого экземпляра шаблона создается идентичная копия этого представителя.

Реализация Polyspace

Чекер помечает представителей данных классов шаблонов, которые не зависят от параметров шаблона. Шашка не помечает представителя функции.

Если эта проверка пометила несколько представителей данных шаблона, создайте базовый класс для шаблона, который агрегирует эти представители данных.

В некоторых случаях вы, возможно, не хотите строго придерживаться этого правила. Например, если только один представитель класса шаблона не зависит от параметра шаблона, можно не создавать отдельный базовый класс для этого представителя. Если вы не хотите устранять проблему, добавьте комментарии к своему результату или коду, чтобы избежать другой проверки. Смотрите Адрес Результаты Polyspace через исправления ошибок или обоснования.

Поиск и устранение проблем

Если вы ожидаете нарушения правил, но не видите его, обратитесь к разделу «Стандартные нарушения кодирования не отображаются».

Примеры

расширить все

#include <cstdint>

template <typename T> 
class aDataArray {
    T data[100];
    int32_t metadata[2]; //Noncompliant 
    int32_t info;        //Noncompliant
};

class metadataArray {
    int32_t metadata[2];
    int32_t info;
};

template <typename T> 
class anotherDataArray: public metadataArray { //Compliant
    T data[100];
};

В этом примере класс шаблона aDataArray включает в себя представители данных metadata и info которые не зависят от типа параметра шаблона, T. Класс шаблона anotherDataArray избегает ненужных экземпляров. Этот класс получают из базового класса metadataArray, который агрегирует представителей данных, не зависящие от типа.

Проверяйте информацию

Группа: Шаблоны
Категория: Консультационная, частично автоматизированная