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

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

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