У меня есть требование, где мне нужно генерировать аргументы функции во время выполнения.
Во время компиляции я не знаю количество аргументов или их тип. Он должен быть прочитан из файла во время выполнения, сгенерировать код и динамически загружен.
Я использовал язык генерации макросов M4 раньше. Он обеспечивает отличную производительность за счет удобства чтения и удобства использования.
Я не хотел идти по этому пути в этот раз и думал об использовании шаблонов C ++ 11 Variadic.
Есть ли лучшая альтернатива?
Шаблоны Varadic не будут работать, потому что вам нужно знать во время компиляции все возможные списки типов аргументов, а затем создавать шаблоны для каждого из них.
Ваша проблема заключается в сериализации во время выполнения и десериализации типов. C ++ не имеет встроенного стандартного способа сделать это.
Вам нужно будет создать некоторые GenericParameter
введите и затем:
`vector<GenericParameter*> params`
или похожие. Затем для каждого типа, который вы хотите кодировать, создайте производный класс GenericParameter для его упаковки. Когда вы сериализуете набор параметров, вам нужно создать и сохранить своего рода идентификатор типа для каждого производного класса, а затем сериализовать данные для этого класса. Аналогично в обратном направлении вы читаете идентификатор типа, создаете соответствующий производный класс для этого идентификатора типа и затем заполняете его данными для этого класса.
Получив это, вы сможете использовать шаблоны varadic, чтобы убедиться, что вектор параметров соответствует скомпилированной функции, и связать вектор времени выполнения со статически известной сигнатурой функции, а также автоматически сгенерировать адаптер, который принимает универсальный вектор и распаковывает параметры в нативные типы. Аналогично в другом направлении.
Что-то, на что можно посмотреть, называется protobuf, оно активно используется в Google для такого рода вещей, и я слышал об этом много хорошего.
Других решений пока нет …