Я написал некоторый код моделирования физики в C++, и парсинг входных текстовых файлов является узким местом его. Как один из входных параметров, пользователь должен указать математическую функцию, которая будет много раз оцениваться во времени выполнения. Код C++ имеет некоторые предопределенные функциональные классы для этого (они на самом деле довольно сложны на математической стороне), и некоторые ограниченная возможность парсинга, но я не удовлетворен этой конструкцией вообще.
То, в чем я нуждаюсь, - то, что и алгоритм и функциональная оценка остаются быстрыми, таким образом, выгодно сохранить их обоих как скомпилированный код (и предпочтительно, математические функции как функциональные объекты C++). Однако я думал о glueing целое моделирование вместе с Python: пользователь мог указать входные параметры в сценарии Python, также реализовывая устройство хранения данных, визуализацию результатов (matplotlib) и GUI также в Python.
Я знаю, что большую часть времени, выставляя классы C++ может быть сделан, например, с БОЛЬШИМ ГЛОТКОМ, но у меня все еще есть вопрос относительно парсинга определяемой пользователем математической функции в Python:
Действительно ли возможно так или иначе, чтобы создать функциональный объект C++ в Python и передать его алгоритму C++? Например, когда я звоню
f = WrappedCPPGaussianFunctionClass(sigma=0.5)
WrappedCPPAlgorithm(f)
в Python это возвратило бы указатель на объект C++, который будет затем передан стандартной программе C++ требование такого указателя, или что-то подобное... (не спрашивайте меня об управлении памятью в этом случае, хотя :S)
Дело в том, что никакой обратный вызов не должен быть сделан к коду Python в алгоритме. Позже я хотел бы расширить этот пример, чтобы также сделать некоторый парсинг простого выражения на стороне Python, такой как сумма или продукт функций, и возвратить некоторый составной объект, дерево синтаксического анализа как объект C++, но давайте останемся в основах на данный момент.
Извините за длинное сообщение и спасибо за предложения заранее.
Я все время делаю подобные вещи. Самое простое решение, которое я обычно выбираю, потому что, по крайней мере, я ленив, состоит в том, чтобы преобразовать ваш API в C-подобный API, а затем просто передать указатели на Python (или другой язык по вашему выбору) и обратно.
Сначала создайте свои классы
class MyFunctionClass
{
public:
MyFunctionClass(int Param)
...
};
class MyAlgorithmClass
{
public:
MyAlgorithmClass(myfunctionclass& Func)
...
};
Затем создайте api функций в стиле C, которые создают и уничтожают эти классы. Обычно я старался передать void *, потому что языки, которые я использую, в любом случае не поддерживают безопасность типов. Так просто проще. Просто убедитесь, что вы вернулись к правильному типу, прежде чем использовать void *
void* CreateFunction(int Param)
{
return new MyFunctionClass(Param);
}
void DeleteFunction(void* pFunc)
{
if (pFunc)
delete (MyFunctionClass*)pFunc;
}
void* CreateAlgorithm(void* pFunc)
{
return new MyAlgorithmClass(*(MyFunctionClass*)pFunc)
}
void DelteAlgorithm(void* pAlg)
{
if (pAlg)
delete (MyAlgorithmClass*)pAlg;
}
. Все, что вам нужно сделать, это заставить python вызывать эту функцию в стиле C. Фактически, они могут (и, вероятно, должны) быть внешними функциями «c», чтобы значительно упростить связывание.