Мета-программирование и генерация кода во время выполнения

У меня есть требование, где мне нужно генерировать аргументы функции во время выполнения.
Во время компиляции я не знаю количество аргументов или их тип. Он должен быть прочитан из файла во время выполнения, сгенерировать код и динамически загружен.

Я использовал язык генерации макросов M4 раньше. Он обеспечивает отличную производительность за счет удобства чтения и удобства использования.

Я не хотел идти по этому пути в этот раз и думал об использовании шаблонов C ++ 11 Variadic.

Есть ли лучшая альтернатива?

0

Решение

Шаблоны Varadic не будут работать, потому что вам нужно знать во время компиляции все возможные списки типов аргументов, а затем создавать шаблоны для каждого из них.

Ваша проблема заключается в сериализации во время выполнения и десериализации типов. C ++ не имеет встроенного стандартного способа сделать это.

Вам нужно будет создать некоторые GenericParameter введите и затем:

`vector<GenericParameter*> params`

или похожие. Затем для каждого типа, который вы хотите кодировать, создайте производный класс GenericParameter для его упаковки. Когда вы сериализуете набор параметров, вам нужно создать и сохранить своего рода идентификатор типа для каждого производного класса, а затем сериализовать данные для этого класса. Аналогично в обратном направлении вы читаете идентификатор типа, создаете соответствующий производный класс для этого идентификатора типа и затем заполняете его данными для этого класса.

Получив это, вы сможете использовать шаблоны varadic, чтобы убедиться, что вектор параметров соответствует скомпилированной функции, и связать вектор времени выполнения со статически известной сигнатурой функции, а также автоматически сгенерировать адаптер, который принимает универсальный вектор и распаковывает параметры в нативные типы. Аналогично в другом направлении.

Что-то, на что можно посмотреть, называется protobuf, оно активно используется в Google для такого рода вещей, и я слышал об этом много хорошего.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]