Создание scriptable приложения C++

x.proc(z) выбирают из методов типа x (то есть X) во время компиляции. Единственный доступный метод - proc(X).

Также имейте в виду, что public void proc(Z p) в Z не отменяет public void proc(X p).

8
задан drby 28 January 2009 в 12:46
поделиться

8 ответов

Я также пошел бы для ответа языка сценариев.

Используя чистый C++, я, вероятно, использовал бы парсер-генератор, какое желание получит маркерные и грамматические правила и даст мне код C, который точно может проанализировать язык вызова заданной функции и предоставляет мне синтаксическое дерево того вызова. flex может использоваться для маркирования входа, и bison может использоваться, чтобы проанализировать маркеры и преобразовать их в синтаксическое дерево. Кроме того, к тому подходу, Дух Повышения может использоваться для парсинга языка вызова функции также. Я никогда не использовал ни одного из этих инструментов, но работал над программами, которые используют их, таким образом я несколько знаю то, что я использовал бы в случае, если я должен был решить ту проблему.

Для очень простых случаев Вы могли изменить свой синтаксис на это:

func_name arg1, arg2

Затем можно использовать:

std::istringstream str(line);
std::string fun_name; str >> fun_name;
map[fun_name](tokenize_args(str));

Карта была бы a

std::map<std::string, boost::function<void(std::vector<std::string>)> > map;

Который был бы заполнен с функциями в начале Вашей программы. tokenize_args просто разделил бы аргументы и возвратил бы вектор их как строки. Конечно, это очень примитивно, но я думаю, что разумно, если все, что Вы хотите, будет некоторым способом вызвать функцию (конечно, если Вы захотите действительно поддержку сценария, то этот подход не будет достаточен).

5
ответ дан 5 December 2019 в 05:34
поделиться

Можно встроить Python справедливо просто, и это дало бы Вам действительно мощный, расширяемый способ написать сценарий Вашей программы. Можно использовать следующее для легко (более или менее) выставляют код C++ Python:

Я лично использую Повышение Python, и я доволен им, но это не спешит компилировать и может быть трудно отладить.

10
ответ дан 5 December 2019 в 05:34
поделиться

Поскольку Daniel сказал:

Языки сценария как Lua и Python были бы наиболее используемыми языками сценария для библиотек C++ связывания.

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

3
ответ дан 5 December 2019 в 05:34
поделиться

Вы могли смотреть на Lua.

8
ответ дан 5 December 2019 в 05:34
поделиться

CERN обеспечивает CINT, интерпретатор C/C++, который может быть встроен в рамках Вашего приложения для обеспечения поддержки сценариев.

2
ответ дан 5 December 2019 в 05:34
поделиться

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

В совместимых POSIX операционных системах (как Linux), можно использовать dlopen () и dlsym (). Вы просто анализируете входную строку и выясняете имя функции и аргументы. Затем можно попросить, чтобы компоновщик нашел функцию по имени с помощью dlsym ().

В Windows однако, эти функции не доступны (если нет некоторая среда POSIX вокруг, как Cygwin). Но можно использовать Windows API.

Можно смотреть здесь для получения дополнительной информации об этих вещах: http://en.wikipedia.org/wiki/Dynamic_loading

1
ответ дан 5 December 2019 в 05:34
поделиться

Отражение C++ [2] Fabio Lombardelli обеспечивает полное отражение для C++ через шаблонные методы метапрограммирования. В то время как это полностью совместимо со стандартами C++, это требует, чтобы программист аннотировал классы в порядке forthem, чтобы быть отражающим

http://cppreflect.sourceforge.net/

иначе Вы хотели бы хеш-таблицу указателя функции, я думаю

1
ответ дан 5 December 2019 в 05:34
поделиться

Ваша система должна "взять строку"? Вы могли выставить COM (или CORBA, или безотносительно) интерфейсы на Вашем приложении и иметь то, что генерирует эти команды вызов в Ваше приложение непосредственно.

0
ответ дан 5 December 2019 в 05:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: