У меня есть несколько объявлений struct
, которые помечены макросом COMPONENT
. Я хотел бы построить список типов из этих объявлений. Учитывая этот код:
// a.hpp
COMPONENT(A) {
// struct body
};
// bc.hpp
COMPONENT(B) {
// struct body
};
COMPONENT(C) {
// struct body
};
Я хотел бы создать кортеж, который выглядит так:
constexpr auto components = std::make_tuple(
Comp<A>{“A”},
Comp<B>{“B”},
Comp<C>{“C”}
);
Порядок элементов в кортеже не имеет значения. Мне также придется вручную включить все заголовки, содержащие объявления COMPONENT
.
Я мог бы написать скрипт Python, который генерирует файл во время сборки, но я хотел бы сделать это с препроцессором, если это возможно. Я не думаю, что это возможно, но я видел, как люди делают какие-то сумасшедшие вещи с препроцессором, поэтому я решил спросить. Я не понимаю метапрограммирование макросов так же хорошо, как понимаю метапрограммирование шаблонов.
@MichaelKenzel Общая десериализация. Когда я читаю «B» в файле, я знаю, что должен десериализовать структуру B.
@MichaelKenzel Раньше я просто писал список вручную. Я хотел бы автоматизировать это с помощью препроцессора.
Вы можете взглянуть на протобуф
@MichaelKenzel На первый взгляд кажется, что protobuf не поддерживает полиморфизм, которого я могу добиться, написав список типов.
@ Kerndog73 «На первый взгляд кажется, что protobuf не поддерживает полиморфизм, которого я могу добиться, написав список типов». Ну, по крайней мере, protobuf может работать с расширения, это не совсем то же самое, что полиморфизм, но очень похоже, и хорошо разработано для определения протокольные сообщения и их анализа.
Вы не можете сделать это с самим препроцессором C. Он очень ограничен и не поддерживает полноценный скриптовый язык — ни в коем случае.
Ваши два курса действий:
Вариант 1 требует гораздо больше усилий (если только вы не можете адаптировать другой существующий инструмент), но он точен; вариант 2 требует небольших усилий, но довольно неточен без «изобретения велосипеда» - с ложными срабатываниями (например, имена макросов в строках) и, возможно, также ложными срабатываниями (например, макрос применяется внутри макроса, когда его имя генерируется путем объединения идентификаторов) .
Что именно вы планируете делать с этой информацией? Возможно, есть лучший способ добиться того, что вы в конечном итоге пытаетесь сделать…