cor*_*ail 6 c++ python functor word-wrap
我用C++编写了一些物理仿真代码,解析输入文本文件是它的一个瓶颈.作为输入参数之一,用户必须指定一个数学函数,该函数将在运行时多次评估.C++代码有一些预先定义的函数类(它们在数学方面实际上非常复杂)和一些有限的解析能力但我对这种结构完全不满意.
我需要的是算法和函数评估都保持快速,因此将它们保存为编译代码(最好是数学函数作为C++函数对象)是有利的.然而,我想到将整个模拟与Python粘合在一起:用户可以在Python脚本中指定输入参数,同时在Python中实现存储,结果可视化(matplotlib)和GUI.
我知道大多数时候,暴露C++类可以完成,例如使用SWIG,但我仍然有一个关于在Python中解析用户定义的数学函数的问题:
有可能以某种方式在Python中构造一个C++函数对象并将其传递给C++算法吗? 比如我打电话的时候
f = WrappedCPPGaussianFunctionClass(sigma=0.5)
WrappedCPPAlgorithm(f)
Run Code Online (Sandbox Code Playgroud)
在Python中,它会返回一个指向C++对象的指针,然后将其传递给需要这样一个指针的C++例程,或类似的东西......(在这种情况下,不要问我有关内存管理的问题,但是:S)
关键是不应该在算法中对Python代码进行回调.后来我想扩展这个例子,也可以在Python端进行一些简单的表达式解析,比如求和或函数的乘积,然后返回一些复合,像C++对象一样的解析树,但现在让我们继续保持基础.
对不起,长期发布的帖子和thx的建议提前.
我一直在做类似的事情。最简单的解决方案,也是我通常选择的解决方案,因为如果没有别的原因,我很懒,就是将您的 API 扁平化为类似 C 的 API,然后仅在 Python(或您选择的其他语言)之间传递指针。
首先创建你的类
class MyFunctionClass
{
public:
MyFunctionClass(int Param)
...
};
class MyAlgorithmClass
{
public:
MyAlgorithmClass(myfunctionclass& Func)
...
};
Run Code Online (Sandbox Code Playgroud)
然后创建一个 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;
}
Run Code Online (Sandbox Code Playgroud)
您所需要做的就是让 python 调用那些 C 风格的函数。事实上,它们可以(并且可能应该)是外部“c”函数,以使链接更加容易。
| 归档时间: |
|
| 查看次数: |
819 次 |
| 最近记录: |