Функции C++, доступные для системы сценариев — типы параметров с самоописанием

StackOverflow https://stackoverflow.com/questions/2039152

  •  19-09-2019
  •  | 
  •  

Вопрос

Механизм правил C++ определяет правила в XML, где каждое правило сводится к следующему: «если X, то Y», где X — это набор тестов, а Y — набор действий.В коде C++ «функции», используемые в тестах/действиях, создаются как класс для каждой «функции», каждая из которых имеет метод «run(args)»...каждый принимает свой собственный набор параметров.

Это работает нормально.

Но нужен отдельный инструмент, чтобы избавить пользователей от ручной обработки XML;механизм правил предназначен для непрограммистов.Инструменту необходимо знать все доступные «функции», а также их необходимые входные параметры.Как лучше всего это сделать?Я рассмотрел пару возможностей:

  1. Файл конфигурации описывает «функции» и их параметры и читается инструментом.Это довольно просто, и реальный код C++ может использовать его для проверки аргументов, но при этом не гарантируется синхронизация C++ и XML — программист может модифицировать C++ и забыть обновить XML, что приведет к ошибкам проверки.
  2. Каждый класс функции имеет методы, которые его описывают.Каким-то образом инструмент загружает классы C++...это было бы легко на языке, поддерживающем отражение, но сложнее на C++, возможно, вам придется создать специальную DLL со всеми «функциями» или чем-то еще.Это означает дополнительные накладные расходы.

Что имеет смысл, учитывая природу C++?

РЕДАКТИРОВАТЬ:название носит описательный характер?Я не могу придумать лучшего.

Это было полезно?

Решение

Есть третий путь – IDL.

Представьте, что у вас есть клиент-серверное приложение и генератор кода, который создает классы-оболочки, которые вы можете развернуть на клиенте и сервере, чтобы пользователь мог написать приложение, используя клиентский API, а обработка происходила на сервере...это типичный сценарий RPC, который используется в DCE-RPC, ONC-RPC, CORBA, COM и других.

Хитрость здесь заключается в том, чтобы определить сигнатуры методов, которые может вызывать клиент, что делается на языке определения интерфейса.Это не должно быть сложно, но это источник API клиент/сервер, вы запускаете его через генератор, и он создает классы C++, которые вы компилируете для использования клиентом.

В вашем случае это звучит так, будто XML — это IDL.поэтому вы можете создать инструмент, который принимает XML и создает заголовки C++, описывающие функции, предоставляемые вашим кодом.На самом деле вам не обязательно создавать файлы cpp (вы могли бы), но проще просто сгенерировать заголовки, поэтому программист, добавляющий новую функцию/параметр, не может забыть обновить реализацию - он просто не будет компилироваться после появления заголовков. были сгенерированы заново.

Вы можете создать заголовок, который #included в существующие заголовки C++, если там есть нечто большее, чем просто определения функций.

Итак, это мое предложение №3:генерировать определения из ваших окончательных подписей XML.

Другие советы

Есть еще один способ:

  • Добавьте ограничение, обеспечивающее единообразие типов аргументов при вызове функции.
  • определить некоторое максимальное количество аргументов
  • описать типы и приоритет, т.е. double конвертируется в String но не наоборот

тогда у тебя есть

void f(int a1) .. f(int a1 .. int aN)
void f(double a1) .. f(double a1 .. double aN)
..
void f(T a1) .. 

И другие конкретные типы данных, такие как String, Date и т. д.

Преимущества:

  • Изменения в подписи фиксированные и регулярные
  • можно предоставить только «самую большую» сигнатуру типа (T)
  • хорошо работает с шаблонами и языковыми мостами
  • может предупредить действие f с двумя целочисленными параметрами не определено
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top