![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() |
Count0 |
![]()
Сообщение
#1
|
Студент ![]() Группа: Новичок Сообщений: 17 Регистрация: 30.7.2011 Пользователь №: 2772 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Доброго времени суток.
Возникла следующая проблема: Для исследовательского ПО разрабатывается программный код использующий динамические библиотеки для хранения взаимозаменяемых алгоритмов. Поскольку цель ПО - проведение исследований, то в дальнейшем планируется появление неограниченного числа новых библиотек, ни сигнатуру ни корректность функций которых не представляется возможным проконтролировать. Поэтому пришлось разработать иерархию шаблонных классов которые принимают указатель на функцию библиотеки, описание допустимых диапазонов ее параметров, на основе которых генерирую пользовательский интерфейс для инициализации параметров, а затем по требованию пользователя запускают ее по указателю. Таким образом, все что требуется от разработчика библиотеки создать функцию обертку которая передает все данные в синглтон-регистратор. Вопрос в том: можно ли избежать включения всех исходников данной иерархии в динамическую библиотеку, оставив их только в основной части программы, а вбиблиотеках ограничиться опережающими объявлениями. |
|
|
![]() |
Flex Ferrum |
![]()
Сообщение
#2
|
Студент ![]() Группа: Новичок Сообщений: 16 Регистрация: 26.11.2007 Пользователь №: 26 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
(зашёл сюда по приглашению ViGOur'а)
Мне видится такой вариант ответа на поставленный в первом посте вопрос - скомбинировать compiletime-анализ в runtime. Со стороны плагина делается следующее: 1. Для плагина делается небольшой шаблонный фреймворк, основная задача которого - принять сигнатуру тестируемой функции, констрейнты на аргументы и превратить это в универсальный invoke-ер. При этом фреймворк (используя typeinfo и typename для сигнатуры функции и для каждого аргумента) формирует набор структур, которые однозначно и с необходимой детализацией эту функцию описывают. В общем итоге плагин передаёт приложению следующую информацию: - Полученные на этапе компиляции структуры, описывающие типы аргументов функции и констрейнты на них; - Указатель на функцию-invoker (с точно заданной сигнатурой), которая получает на массив аргументов и передаёт их в тестируемую функцию. 2. Со стороны приложения делается runtime-анализатор данных, полученных от плагина. На основании этих данных строится GUI, прописываются валидаторы аргументов и т. д. Когда пользователь нажимает на кнопку "test" (или как она там будет называться), то введённые им аргументы превращаются в массив структур, и этот массив передаётся в invoke-ер. Там все элементы этого массива превращаются в аргументы тестируемой функции и делается собственно вызов. Для добавления type safety можно использовать boost::variant для передачи значений аргументов (ведь GUI будет работать с конечным набором типов). |
|
|
![]() ![]() ![]() |
![]() |
|
Текстовая версия | Сейчас: 17.6.2025, 21:39 |