6

我用 C++ 编写了一些物理模拟代码,解析输入文本文件是它的瓶颈。作为输入参数之一,用户必须指定一个数学函数,该函数将在运行时进行多次评估。C++ 代码为此有一些预定义的函数类(它们实际上在数学方面非常复杂)和一些有限的解析能力,但我对这种结构一点也不满意。

我需要的是算法和函数评估都保持快速,因此将它们都保留为编译代码(最好将数学函数作为 C++ 函数对象)是有利的。然而,我想将整个模拟与 Python 结合在一起:用户可以在 Python 脚本中指定输入参数,同时也可以在 Python 中实现结果的存储、可视化(matplotlib)和 GUI。

我知道大多数时候可以公开 C++ 类,例如使用 SWIG,但我仍然对 Python 中用户定义的数学函数的解析有疑问:

是否有可能以某种方式在 Python 中构造一个 C++ 函数对象并将其传递给 C++ 算法? 例如,当我打电话时

f = WrappedCPPGaussianFunctionClass(sigma=0.5)
WrappedCPPAlgorithm(f)

在 Python 中,它会返回一个指向 C++ 对象的指针,然后将其传递给需要这样一个指针的 C++ 例程,或者类似的东西......(在这种情况下不要问我关于内存管理的问题,虽然:S)

关键是不应对算法中的Python代码进行回调。稍后我想扩展这个例子,在 Python 端做一些简单的表达式解析,例如函数的求和或乘积,并返回一些复合的、解析树的 C++ 对象,但现在让我们停留在基础知识上。

对不起,很长的帖子,谢谢提前提出的建议。

4

1 回答 1

3

我一直在做类似的事情。最简单的解决方案,也是我通常选择的解决方案,因为如果没有别的,我很懒,就是将您的 API 扁平化为类似 C 的 API,然后只在 Python(或您选择的其他语言)之间传递指针。

首先创建你的类

class MyFunctionClass
{
  public:
    MyFunctionClass(int Param)
    ...
};

class MyAlgorithmClass
{
  public:
    MyAlgorithmClass(myfunctionclass& Func)
    ...
};

然后创建一个 C 风格的函数 API 来创建和销毁这些类。我通常会全力以赴传递 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风格的函数。事实上,它们可以(并且可能应该)是 extern "c" 函数,以使链接更容易。

于 2010-05-07T21:52:06.287 回答