c++ - 通过 Python 将 C++ 对象传递给 C++ 代码?

标签 c++ python word-wrap functor

我用 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++ 对象,但让我们现在停留在基础上。

抱歉发了这么长的帖子,感谢提前提出的建议。

最佳答案

我一直在做类似的事情。最简单的解决方案,也是我通常选择的解决方案,因为如果不出意外的话,我很懒惰,就是将您的 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"函数以使链接更容易。

关于c++ - 通过 Python 将 C++ 对象传递给 C++ 代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2791653/

相关文章:

database - 使用 ColdFusion 在 Excel 列中进行文本换行或自动宽度调整

c++ - 如何在保持使用一致性的同时拆分职责?

c++ - 当我的服务器出现故障时,排队的 FastCGI 请求会发生什么情况?

python - QFileSystemWatcher 不为另一个应用程序所做的更改发出 fileChanged 信号

python - 生产服务器上出现 NoReverseMatch at/error,但本地没有问题

python - 有人可以解释这个按位数组环绕表达式吗?

python - 将数据框列文本包装为具有不同长度约束的多个列

Raspberry Pi 1 B 上的 c++ bass 和 rapidXml

c++ - 什么操作可以使 float 离开 [0, 1] 范围?

javascript - 使用 Python 自动登录带有 JavaScript 表单的网站