次のような構造体の const 配列があります。
static const SettingsSuT _table[] = {{5,1}、{1,2}、{1,1}など};
構造は次のとおりです。
- size_bytes:
- アイテム数:
- その他の「メタデータ」メンバー
したがって、「合計サイズ」は、1 つの要素の size_bytes*num_items です。この情報はすべて const 配列にあり、コンパイル時に利用できます。ただし、_table の合計サイズは EEPROM 自体のサイズとは関係がないことに注意してください。_table は EEPROM をミラーリングしません。必要なレイアウト、使用法、およびその他の「メタデータ」タイプの情報のみを記述します。ただし、このメタデータを使用して、使用している EEPROM の量を判断できます。
配列は、固定/最大サイズを持つ外部 EEPROM に格納されているデータを単に記述します。機能が追加および削除されると、const 配列のエントリが変更されます。現在、データの合計サイズをランタイム チェックして、EEPROM サイズを超えないようにしています。
ただし、ビルドがすぐに停止するように、これらのランタイム チェックの多くを static_assert スタイルのテンプレート チェックに変更しています。私はテンプレートの専門家ではないので、これについていくつかの助けを借りることができます.
したがって、質問: すべての要素のサイズを合計するテンプレートを作成し (各要素の値を乗算してから、すべての結果を追加する)、 static_assert を実行し、マジック ナンバーのサイズを超えた場合にビルドを停止する方法EEPROMの。ひとつのアプローチとして典型的な再帰階乗テンプレートの例を見ていましたが、配列にアクセスできず、const値が必要です(と思います)。
助けてくれてどうもありがとう、