exponenta event banner

Правило AUTOSAR C++ 14 A14-5-2

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

Описание

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

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

Объяснение

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

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

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

Внедрение 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, который агрегирует элементы данных, не зависящие от типа.

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

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