繁体   English   中英

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

[英]Passing C++ object to C++ code through Python?

我用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 ++对象一样的解析树,但现在让我们保持基础。

对不起,长期发布的帖子和thx的建议提前。

我总是这样做。 最简单的解决方案,也是我经常选择的解决方案,因为,如果没有别的,我很懒,就是将你的API压缩成类似C的API,然后只是传递指向Python(或你选择的其他语言)的指针。

首先创建你的类

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

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

然后创建一个C风格的函数api,用于创建和销毁这些类。 因为我使用的语言无论如何都不保持类型安全,所以我通常在外面通过无效*传播。 这样更简单。 只需确保在实际使用空格之前回到正确的类型*

    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”函数,以使链接更容易。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM