我目前正在为现有的 C++ 库制作 Cython 包装器。我在 C++ 中有一个重载的非成员运算符,例如
Data operator+(Data const& a, Data const& b)
在描述标题的 pxd
文件中,我写道
cdef extern from 'blabla.h':
Data operator+(const Data&, const Data&)
现在如何在另一个 pyx
文件中使用这个 operator+
?
最佳答案
对于非常简单的情况,例如在您的示例中,您可以对 Cython 撒谎并告诉它该运算符是成员函数:
cdef extern from 'blabla.h':
cdef cppclass Data:
# the rest of the data definitions
Data operator+(const Data&)
它仅使用此信息来知道它可以将代码 a+b
(其中 a
和 b
是数据对象)转换为__pyx_v_a + __pyx_v_b
并让 c++ 编译器完成其余的工作(由于从“blabla.h”导入,它知道如何做)。因此,成员(member)和非成员(member)之间的区别是无关紧要的。
但是:使用非成员运算符的主要原因之一是允许诸如
Data operator+(int a, const Data& b);
你可以做到这一点,但它有点困惑。在你的 pxd 文件中执行
cdef extern from 'blabla.h':
Data operator+(int, const Data&) # i.e. do nothing special
在你的 pyx 文件中
from my_pxd_file import * # works fine
## but this isn't accepted unfortunately:
from my_pxd_file import operator+
如果您想避免 import *
造成太多命名空间污染,您可以创建一个仅包含运算符而不包含类定义的 pxd 文件(不过我还没有对此进行测试)
总之 - 两种方法取决于您的用例的复杂程度......
关于cython - Cython 中的非成员运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29732524/