我正在为现有的C ++库做一个Cython包装器。我在C ++中有一个重载的非成员运算符,如
Data operator+(Data const& a, Data const& b)
在描述标题的pxd
文件中,我写了
cdef extern from 'blabla.h':
Data operator+(const Data&, const Data&)
现在我如何在另一个operator+
文件中使用此pyx
?
答案 0 :(得分:4)
对于非常简单的情况,就像在你的例子中你可以欺骗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"导入)。因此,成员与非成员之间的区别是无关紧要的。
然而:使用非成员运营商的主要原因之一是允许
这样的事情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文件(我还没有测试过这个)
总之 - 两种方法取决于您的用例的复杂程度......