Накидал библиотеку шаблонных классов на основе списка типов для определения дескрипторов USB.
Код и примеры тут.Что мы получаем по сравнению обычным и/или макросным подходом:
1. Всё поля типизированы. Нарушить формат дескрипторов проблематично.
2. Автоматическое вычисления размеров, количества интерфейсов и т.д.
3. Автоматически заполняемые и вычисляемые поля скрыты, что улучшает восприятие данных.
4. Проверки на корректность данных, дублирование интерфейсов и конечных точек, диапазон значений параметров и т.д.
5. Из дескрипторов легко "вытащить" на этапе компиляции список интерфейсов или конечных точек. Это можно использовать при инициализации USB-модулей контроллера.
Работающие примеры можно посмотреть в Compiler Explorer для
С++17 или
C++20Тут приведу пример дескриптора конфигурации составного устройства из двух CDC.
Вот так из дескриптора можно вытащить, например, адреса конечных точек
Можно много что ещё "поставить на проверку" и автоматизировать. А для начала так. Это уже мощнее любого макроса.