У нас есть константный массив структур, примерно такой:
static const SettingsSuT _table [] = {{5,1}, {1,2}, {1,1} и т. Д.};
структура имеет следующее:
- size_bytes:
- число_объекты:
- Другие члены "метаданных"
Таким образом, «общий размер» равен size_bytes * num_items для одного элемента. Вся эта информация находится в массиве const, доступном во время компиляции. Но, обратите внимание, общий размер _table не связан с размером самой EEPROM. _table не отражает EEPROM, он только описывает структуру, использование и другую информацию типа метаданных, которая нам нужна. Но вы можете использовать эти метаданные для определения количества используемой нами ЭСППЗУ.
Массив просто описывает данные, которые хранятся во внешней EEPROM, которая имеет фиксированный / максимальный размер. По мере добавления и удаления функций записи в массиве const изменяются. В настоящее время мы выполняем проверку общего размера данных во время выполнения, чтобы убедиться, что они не превышают размер EEPROM.
Однако во многих из этих проверок во время выполнения мы перешли к проверкам шаблонов в стиле static_assert, поэтому сборка немедленно останавливается. Я не эксперт по шаблонам, поэтому мог бы помочь с этим.
Итак, вопрос: как создать шаблон, чтобы сложить размер всех элементов (умножить значения каждого элемента, а затем сложить все результаты), а затем выполнить static_assert и остановить сборку, если они превышают магическое число размер EEPROM. Я рассматривал типичный пример рекурсивного факториального шаблона как один из подходов, но он не может получить доступ к массиву, он требует значения const (я думаю).
большое спасибо за любую помощь,