如何在Cython中包装一个C++函数对象

2024-04-29 16:31:30 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图包装一个C++库,其中逻辑在{{CD1>}文件中实现为模板化的函子,我正在努力寻找将C++函子作为Cython/Python函数公开的正确方法。像下面这样的函子应该如何包装在Cython中?在

我相信这应该是可能的,至少对于模板类和函数,根据Cython 0.20 docs。在

<强>注:我想我已经知道如何包装正常的C++函数,当我试图封装一个模板化的<强>函数子< /强>, >即EEM>一个模板^ {< CD2>},它超载了^ {CD3>}运算符(当数据类型固定时,它像一个函数一样)。在

>免责声明:我是C++的新手,如果我在这里犯了明显的错误,我会对Cython非常抱歉。在


我要包装的函子:

#include <vector>
#include "EMD_DEFS.hpp"
#include "flow_utils.hpp"

template<typename NUM_T, FLOW_TYPE_T FLOW_TYPE= NO_FLOW>
struct emd_hat_gd_metric {
    NUM_T operator()(const std::vector<NUM_T>& P, const std::vector<NUM_T>& Q,
                     const std::vector< std::vector<NUM_T> >& C,
                     NUM_T extra_mass_penalty= -1,
                     std::vector< std::vector<NUM_T> >* F= NULL);
};

{cd4> ^{pr2}$

当我试图用cython --cplus wrapper.pyx编译它时,上面给出了一个Calling non-function type 'emd_hat_gd_metric[NUM_T]'错误。在

Here's the full library I'm trying to wrap.

最终目标:能够将emd_hat_gd_metric作为Cython/Python函数调用,参数是NumPy数组。在


Tags: 函数模板includehat错误flowmetricnum
1条回答
网友
1楼 · 发布于 2024-04-29 16:31:30
<>我找不到真正的解决方案,但这里有一个解决方案(需要修改C++代码):只需用C++头中所需的数据类型实例化模板函数,然后在您的^ {CD1>}文件中声明该函数。在

如果需要许多不同的数据类型,这有点笨拙,但我只需要double。如果不需要修改外部库也会更好……但是它可以工作。在


< C++ > {< CD3> }文件:

用所需的数据类型实例化函子(例如,double):

template<typename T>
struct some_template_functor {
    T operator()(T x);
};

// Add this:
some_template_functor<double> some_template_functor_double;

在Cython.pyx文件中:

{no>正常情况下需要声明cd6}:

^{pr2}$

然后可以从Cython中调用some_template_functor_double。在

相关问题 更多 >