メインコンテンツ

AUTOSAR C++14 Rule A14-5-2

Class members that are not dependent on template class parameters should be defined in a separate base class

説明

ルール定義

Class members that are not dependent on template class parameters should be defined in a separate base class.

根拠

テンプレート クラスのメンバーにアクセスするには、テンプレートをインスタンス化する必要があります。メンバーがテンプレート パラメーターに依存しない場合は、このインスタンス化ステップは不要です。たとえば、このテンプレート クラス aClass のメンバーの anotherMembersomeotherMember は、パラメーター T に依存しません。

template <typename T>
class aClass {
   T aMember
   int anotherMember;
   int someotherMember
}
ただし、これらのメンバーにアクセスするには、テンプレート クラス aClass をインスタンス化する必要があります。不必要なテンプレート インスタンス化を避けるために、テンプレート宣言にこれらのメンバーを含めないでください。

テンプレート宣言にこのメンバーを含めると、不必要にコードが増大する可能性もあります。コンパイラは、テンプレートのインスタンス化ごとに、別々のテンプレート クラスのコピーを生成します。クラス メンバーがテンプレート パラメーターに依存しない場合は、テンプレート インスタンス化ごとに、このメンバーの同じコピーが作成されます。

Polyspace 実装

チェッカーは、テンプレート パラメーターに依存しないテンプレート クラスのデータ メンバーにフラグを設定します。また、チェッカーはメンバー関数にはフラグを設定しません。

このチェッカーによってテンプレートの複数のデータ メンバーにフラグが設定された場合は、これらのデータ メンバーを集約するテンプレートの基底クラスを作成します。

場合によっては、このルールに厳密に準拠しないという選択もあり得ます。たとえば、テンプレート パラメーターに依存しないテンプレート クラスのメンバーだけが 1 つだけの場合は、そのメンバー用に別の基底クラスを作成することはしないという選択もあり得ます。問題を修正しない場合は、改めてレビューされないように結果またはコードにコメントを追加します。詳細は、以下を参照してください。

トラブルシューティング

ルール違反が想定されるものの、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 に、テンプレート T の型パラメーターに依存しないデータ メンバーの metadatainfo が含まれています。テンプレート クラス anotherDataArray は、不要なインスタンス化を回避します。このクラスは、型に依存しないデータ メンバーを集約する基底クラス metadataArray の派生クラスです。

チェック情報

グループ: テンプレート
カテゴリ: Advisory、Partially automated