Передача объекта C++ к C++ кодирует через Python?

Я написал некоторый код моделирования физики в 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++, но давайте останемся в основах на данный момент.

Извините за длинное сообщение и спасибо за предложения заранее.

6
задан cornail 7 May 2010 в 21:00
поделиться

1 ответ

Я все время делаю подобные вещи. Самое простое решение, которое я обычно выбираю, потому что, по крайней мере, я ленив, состоит в том, чтобы преобразовать ваш 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», чтобы значительно упростить связывание.

3
ответ дан 17 December 2019 в 18:11
поделиться
Другие вопросы по тегам:

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