我已经用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)
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样式的函数。实际上,它们可以(可能应该)是外部“c”函数,以使链接更容易。
关于c++ - 通过Python将C++对象传递给C++代码?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2791653/