cython - Cython 中的非成员运算符

标签 cython

我目前正在为现有的 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(其中 ab 是数据对象)转换为__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/

相关文章:

python - 将指针传递给cython中的结构

python - Cython 浮点除法 PyExc_ZeroDivision 错误检查

python - python 中 C++ vector 的实例(对于 pyROOT 中的 TTrees)

python - Cython 具体化属性?

python - 在 Cython 中生成随机数的正确方法?

python - Cython 在诗歌 sdist tar.gz 中生成了 c/cpp 文件,用于无 cython 安装

python-3.x - cython 编译但没有生成 pyd 文件

python - 将结构中的 C 结构数组映射到 Cython

python - 在 Cython 代码中使用 float 文字而不是 double?

python - 在cython中使用C函数读写文件中的数组